E/S de arquivos C: criar, abrir, ler, gravar e fechar um arquivo
C Gerenciamento de arquivos
Um arquivo pode ser usado para armazenar um grande volume de dados persistentes. Como muitas outras linguagens, 'C' fornece as seguintes funรงรตes de gerenciamento de arquivos,
- Criaรงรฃo de um arquivo
- Abrindo um arquivo
- Lendo um arquivo
- Escrevendo em um arquivo
- Fechando um arquivo
A seguir estรฃo as funรงรตes de gerenciamento de arquivos mais importantes disponรญveis em 'C,'
| funรงรฃo | e propรณsito | |
|---|---|---|
| fopen() | Criando um arquivo ou abrindo um arquivo existente | |
| fechar() | Fechando um arquivo | |
| fprintf() | Escrevendo um bloco de dados em um arquivo | |
| fscanf() | Lendo dados de um bloco de um arquivo | |
| getc() | Lรช um รบnico caractere de um arquivo | |
| putc() | Grava um รบnico caractere em um arquivo | |
| pegar () | Lรช um nรบmero inteiro de um arquivo | |
| putw() | Escrevendo um nรบmero inteiro em um arquivo | |
| buscar () | Define a posiรงรฃo de um ponteiro de arquivo para um local especificado | |
| contar () | Retorna a posiรงรฃo atual de um ponteiro de arquivo | |
| retroceder () | Define o ponteiro do arquivo no inรญcio de um arquivo |
Como criar um arquivo
Sempre que vocรช quiser trabalhar com um arquivo, o primeiro passo รฉ criar um arquivo. Um arquivo nada mais รฉ do que um espaรงo na memรณria onde os dados sรฃo armazenados.
Para criar um arquivo em um programa 'C', a seguinte sintaxe รฉ usada,
FILE *fp;
fp = fopen ("file_name", "mode");
Na sintaxe acima, o arquivo รฉ uma estrutura de dados definida na biblioteca padrรฃo.
fopen รฉ uma funรงรฃo padrรฃo usada para abrir um arquivo.
- Se o arquivo nรฃo estiver presente no sistema, ele serรก criado e aberto.
- Se um arquivo jรก estiver presente no sistema, ele serรก aberto diretamente usando este funรงรฃo.
fp รฉ um ponteiro de arquivo que aponta para o tipo de arquivo.
Sempre que vocรช abre ou cria um arquivo, vocรช deve especificar o que farรก com o arquivo. Um arquivo em programaรงรฃo 'C' pode ser criado ou aberto para fins de leitura/escrita. Um modo รฉ usado para especificar se vocรช deseja abrir um arquivo para qualquer uma das finalidades fornecidas abaixo. A seguir estรฃo os diferentes tipos de modos de programaรงรฃo 'C' que podem ser usados โโao trabalhar com um arquivo.
| Modo de Arquivo | Descriรงรฃo |
|---|---|
| r | Abra um arquivo para leitura. Se um arquivo estiver no modo de leitura, nenhum dado serรก excluรญdo se um arquivo jรก estiver presente em um sistema. |
| w | Abra um arquivo para gravaรงรฃo. Se um arquivo estiver no modo de gravaรงรฃo, um novo arquivo serรก criado se o arquivo nรฃo existir. Se um arquivo jรก estiver presente em um sistema, todos os dados dentro do arquivo serรฃo truncados e ele serรก aberto para fins de gravaรงรฃo. |
| a | Abra um arquivo em modo de acrรฉscimo. Se um arquivo estiver no modo de acrรฉscimo, o arquivo serรก aberto. O conteรบdo do arquivo nรฃo muda. |
| r+ | aberto para leitura e escrita desde o inรญcio |
| w+ | aberto para leitura e escrita, substituindo um arquivo |
| a+ | aberto para leitura e escrita, anexando ao arquivo |
Na sintaxe fornecida, o nome do arquivo e o modo sรฃo especificados como strings, portanto, devem sempre ser colocados entre aspas duplas.
Exemplo:
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen ("data.txt", "w");
}
Saรญda:
O arquivo รฉ criado na mesma pasta onde vocรช salvou seu cรณdigo.
Vocรช pode especificar o caminho onde deseja criar seu arquivo
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen ("D://data.txt", "w");
}
Como fechar um arquivo
Deve-se sempre fechar um arquivo sempre que as operaรงรตes no arquivo terminarem. Isso significa que o conteรบdo e os links para o arquivo foram encerrados. Isso evita danos acidentais ao arquivo.
'C' fornece a funรงรฃo fclose para realizar a operaรงรฃo de fechamento de arquivo. A sintaxe de fclose รฉ a seguinte,
fclose (file_pointer);
Exemplo:
FILE *fp;
fp = fopen ("data.txt", "r");
fclose (fp);
A funรงรฃo fclose usa um ponteiro de arquivo como argumento. O arquivo associado ao ponteiro do arquivo รฉ entรฃo fechado com a ajuda da funรงรฃo fclose. Ele retorna 0 se o fechamento foi bem-sucedido e EOF (fim do arquivo) se ocorreu um erro durante o fechamento do arquivo.
Apรณs fechar o arquivo, o mesmo ponteiro de arquivo tambรฉm pode ser usado com outros arquivos.
Na programaรงรฃo 'C', os arquivos sรฃo fechados automaticamente quando o programa รฉ finalizado. Fechar um arquivo manualmente escrevendo a funรงรฃo fclose รฉ uma boa prรกtica de programaรงรฃo.
Gravando em um Arquivo
Em C, quando vocรช grava em um arquivo, os caracteres de nova linha '\n' devem ser adicionados explicitamente.
A biblioteca stdio oferece as funรงรตes necessรกrias para escrever em um arquivo:
- fputc(char, ponteiro_arquivo): grava um caractere no arquivo apontado por file_pointer.
- fputs(str, ponteiro_arquivo): grava uma string no arquivo apontado por file_pointer.
- fprintf(ponteiro_de_arquivo, str, listas_variรกveis): Imprime uma string no arquivo apontado por file_pointer. A string pode incluir opcionalmente especificadores de formato e uma lista de variรกveis โโlistas_variรกveis.
O programa abaixo mostra como realizar a gravaรงรฃo em um arquivo:
Funรงรฃo fputc():
#include <stdio.h>
int main() {
int i;
FILE * fptr;
char fn[50];
char str[] = "Guru99 Rocks\n";
fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
for (i = 0; str[i] != '\n'; i++) {
/* write to file using fputc() function */
fputc(str[i], fptr);
}
fclose(fptr);
return 0;
}
Saรญda:
O programa acima escreve um รบnico caractere no fputc_test.txt arquivo atรฉ chegar ao prรณximo sรญmbolo de linha โ\nโ que indica que a frase foi escrita com sucesso. O processo consiste em pegar cada caractere do array e gravรก-lo no arquivo.
- No programa acima, criamos e abrimos um arquivo chamado fputc_test.txt em modo de gravaรงรฃo e declaramos nossa string que serรก escrita no arquivo.
- Fazemos uma operaรงรฃo de gravaรงรฃo caractere por caractere usando o loop for e colocamos cada caractere em nosso arquivo atรฉ que o caractere โ\nโ seja encontrado, entรฃo o arquivo รฉ fechado usando a funรงรฃo fclose.
fputs() Funรงรฃo:
#include <stdio.h>
int main() {
FILE * fp;
fp = fopen("fputs_test.txt", "w+");
fputs("This is Guru99 Tutorial on fputs,", fp);
fputs("We don't need to use for loop\n", fp);
fputs("Easier than fputc function\n", fp);
fclose(fp);
return (0);
}
Saรญda:
- No programa acima, criamos e abrimos um arquivo chamado fputs_test.txt em modo de gravaรงรฃo.
- Depois de fazermos uma operaรงรฃo de gravaรงรฃo usando a funรงรฃo fputs() escrevendo trรชs diferentes cordas
- Em seguida, o arquivo รฉ fechado usando a funรงรฃo fclose.
fprintf()Funรงรฃo:
#include <stdio.h>
int main() {
FILE *fptr;
fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
/* write to file */
fprintf(fptr, "Learning C with Guru99\n");
fclose(fptr);
return 0;
}
Saรญda:
- No programa acima, criamos e abrimos um arquivo chamado fprintf_test.txt em modo de gravaรงรฃo.
- Depois que uma operaรงรฃo de gravaรงรฃo รฉ executada usando a funรงรฃo fprintf() escrevendo uma string, o arquivo รฉ fechado usando a funรงรฃo fclose.
Lendo dados de um arquivo
Existem trรชs funรงรตes diferentes dedicadas ร leitura de dados de um arquivo
- fgetc(ponteiro_arquivo): Ele retorna o prรณximo caractere do arquivo apontado pelo ponteiro do arquivo. Quando o final do arquivo for atingido, o EOF serรก enviado de volta.
- fgets(buffer, n, ponteiro_arquivo): Ele lรช n-1 caracteres do arquivo e armazena a string em um buffer no qual o caractere NULL '\0' รฉ anexado como o รบltimo caractere.
- fscanf(ponteiro_de_arquivo, especificadores de conversรฃo, endereรงos_variรกveis): รฉ usado para analisar e analisar dados. Ele lรช caracteres do arquivo e atribui a entrada a uma lista de ponteiros variรกveis endereรงos_variรกveis โโusando especificadores de conversรฃo. Tenha em mente que, assim como acontece com o scanf, o fscanf para de ler uma string quando um espaรงo ou uma nova linha รฉ encontrado.
O programa a seguir demonstra a leitura do arquivo fputs_test.txt usando as funรงรตes fgets(),fscanf() e fgetc() respectivamente:
#include <stdio.h>
int main() {
FILE * file_pointer;
char buffer[30], c;
file_pointer = fopen("fprintf_test.txt", "r");
printf("----read a line----\n");
fgets(buffer, 50, file_pointer);
printf("%s\n", buffer);
printf("----read and parse data----\n");
file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
char str1[10], str2[2], str3[20], str4[2];
fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
printf("Read String1 |%s|\n", str1);
printf("Read String2 |%s|\n", str2);
printf("Read String3 |%s|\n", str3);
printf("Read String4 |%s|\n", str4);
printf("----read the entire file----\n");
file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
while ((c = getc(file_pointer)) != EOF) printf("%c", c);
fclose(file_pointer);
return 0;
}
Resultado:
----read a line---- Learning C with Guru99 ----read and parse data---- Read String1 |Learning| Read String2 |C| Read String3 |with| Read String4 |Guru99| ----read the entire file---- Learning C with Guru99
- No programa acima, abrimos o arquivo chamado โfprintf_test.txtโ que foi escrito anteriormente usando a funรงรฃo fprintf() e contรฉm a string โAprendendo C com Guru99โ. Lemos usando a funรงรฃo fgets() que lรช linha por linha onde o tamanho do buffer deve ser suficiente para lidar com a linha inteira.
- Reabrimos o arquivo para redefinir o arquivo ponteiro para apontar para o inรญcio do arquivo. Crie vรกrias variรกveis โโde string para lidar com cada palavra separadamente. Imprima as variรกveis โโpara ver seu conteรบdo. O fscanf() รฉ usado principalmente para extrair e analisar dados de um arquivo.
- Abra novamente o arquivo para redefinir o arquivo de ponteiro para apontar para o inรญcio do arquivo. Leia os dados e imprima-os do arquivo caractere por caractere usando a funรงรฃo getc() atรฉ que a instruรงรฃo EOF seja encontrada
- Apรณs realizar uma operaรงรฃo de leitura do arquivo utilizando diferentes variantes, fechamos novamente o arquivo utilizando a funรงรฃo fclose.
Leitura e gravaรงรฃo interativa de arquivos com getc e putc
Estas sรฃo as operaรงรตes de arquivo mais simples. Getc significa obter caractere e putc significa colocar caractere. Essas duas funรงรตes sรฃo usadas para lidar com apenas um caractere por vez.
O programa a seguir demonstra as funรงรตes de manipulaรงรฃo de arquivos na programaรงรฃo 'C':
#include <stdio.h>
int main() {
FILE * fp;
char c;
printf("File Handling\n");
//open a file
fp = fopen("demo.txt", "w");
//writing operation
while ((c = getchar()) != EOF) {
putc(c, fp);
}
//close file
fclose(fp);
printf("Data Entered:\n");
//reading
fp = fopen("demo.txt", "r");
while ((c = getc(fp)) != EOF) {
printf("%c", c);
}
fclose(fp);
return 0;
}
Saรญda:
- No programa acima, criamos e abrimos um arquivo chamado demo em modo de gravaรงรฃo.
- Apรณs a execuรงรฃo de uma operaรงรฃo de gravaรงรฃo, o arquivo รฉ fechado usando a funรงรฃo fclose.
- Abrimos novamente um arquivo que agora contรฉm dados em modo de leitura. Um loop while serรก executado atรฉ que o eof seja encontrado. Assim que o final do arquivo for encontrado, a operaรงรฃo serรก encerrada e os dados serรฃo exibidos usando a funรงรฃo printf.
- Apรณs realizar uma operaรงรฃo de leitura, o arquivo รฉ fechado novamente usando a funรงรฃo fclose.
Resumo
- Um arquivo รฉ um espaรงo na memรณria onde os dados sรฃo armazenados.
- A programaรงรฃo 'C' fornece vรกrias funรงรตes para lidar com um arquivo.
- Um mecanismo de manipulaรงรฃo dos arquivos รฉ denominado gerenciamento de arquivos.
- Um arquivo deve ser aberto antes de realizar operaรงรตes nele.
- Um arquivo pode ser aberto em modo de leitura, gravaรงรฃo ou acrรฉscimo.
- As funรงรตes Getc e putc sรฃo usadas para ler e escrever um รบnico caractere.
- A funรงรฃo fscanf() permite ler e analisar dados de um arquivo
- Podemos ler (usando o getc funรงรฃo) um arquivo inteiro fazendo um loop para cobrir todo o arquivo atรฉ que o EOF seja encontrado
- Podemos escrever em um arquivo apรณs criar seu nome, usando a funรงรฃo fprintf () e deve ter o caractere de nova linha no final da string de texto.











