E/S de arquivos C: criar, abrir, ler, gravar e fechar um arquivo
โก Resumo Inteligente
Em C, o gerenciamento de arquivos armazena dados persistentes em disco por meio da biblioteca stdio, que abre um arquivo com fopen, escreve com fputc, fputs ou fprintf, lรช com fgetc, fgets ou fscanf e o fecha usando fclose.

C Gerenciamento de arquivos
Um arquivo pode ser usado para armazenar um grande volume de dados persistentes. Assim como muitas outras linguagens, 'C' oferece os seguintes recursos de gerenciamento de arquivos. funรงรตes,
- 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 esta funรงรฃo.
fp รฉ um arquivo apontador que aponta para o arquivo de tipo.
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 | Abre um arquivo no modo de anexaรงรฃo. Se um arquivo estiver no modo de anexaรงรฃo, ele serรก aberto. O conteรบdo do arquivo nรฃo serรก alterado. |
| 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 cordas portanto, devem sempre estar entre aspas duplas.
Por 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);
Por exemplo:
FILE *fp; fp = fopen ("data.txt", "r"); fclose (fp);
A funรงรฃo `fclose` recebe um ponteiro para um arquivo como argumento. O arquivo associado a esse ponteiro รฉ entรฃo fechado com a ajuda da funรงรฃo `fclose`. Ela retorna 0 se o fechamento for bem-sucedido e EOF (fim do arquivo) se ocorrer 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, file_pointer): Escreve um caractere no arquivo apontado por file_pointer.
- fputs(str, file_pointer): Escreve uma string no arquivo apontado por file_pointer.
- fprintf(file_pointer, str, variable_lists): Imprime uma string no arquivo apontado por file_pointer. A string pode opcionalmente incluir especificadores de formato e uma lista de variรกveis โโvariable_lists.
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 arquivo fputc_test.txt atรฉ encontrar o sรญmbolo de prรณxima linha โ\nโ, que indica que a frase foi escrita com sucesso. O processo consiste em pegar cada caractere do array e escrevรช-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.
- Apรณs realizarmos uma operaรงรฃo de escrita usando a funรงรฃo fputs(), escrevendo trรชs strings diferentes
- 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(file_pointer): Retorna o prรณximo caractere do arquivo apontado pelo ponteiro de arquivo. Quando o final do arquivo รฉ atingido, o EOF (fim de arquivo) รฉ retornado.
- fgets(buffer, n, file_pointer): 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_de_variรกveis): ร usado para analisar e interpretar dados. Ele lรช caracteres do arquivo e atribui a entrada a uma lista de ponteiros para variรกveis, `endereรงos_de_variรกveis`, usando especificadores de conversรฃo. Lembre-se de que, assim como com `scanf`, `fscanf` para de ler uma string quando encontra um espaรงo ou uma nova linha.
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 que contรฉm o texto โAprendendo C com GuruA string "99". Nรณs a 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 ponteiro para apontar para o inรญcio do arquivo. Criamos vรกrias variรกveis โโde string para lidar com cada palavra separadamente. Imprimimos as variรกveis โโpara ver seus conteรบdos. A funรงรฃo `fscanf()` รฉ usada principalmente para extrair informaรงรตes do arquivo.trace 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.











