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.

  • ๐Ÿ“ Modos de arquivo: A string de modo passada para fopen โ€” r, w, a, r+, w+ ou a+ โ€” decide se um arquivo serรก lido, sobrescrito ou se serรก adicionado conteรบdo.
  • โœ๏ธ Gravaรงรฃo de dados: fputc escreve um caractere, fputs escreve uma string e fprintf escreve texto formatado no ponteiro de arquivo.
  • ๐Ÿ“– Dados de leitura: fgetc lรช um caractere, fgets lรช uma linha para um buffer e fscanf analisa tokens formatados do arquivo.
  • ๐Ÿ”’ Fechando arquivos: A funรงรฃo fclose descarrega os dados armazenados em buffer e libera o arquivo, retornando 0 em caso de sucesso e EOF em caso de falha.
  • ๐Ÿ” Entrada/Saรญda interativa: As funรงรตes getc e putc processam um รบnico caractere por vez, movendo a entrada diretamente para um arquivo e vice-versa.
  • ๐Ÿค– Assistรชncia de IA: O GitHub Copilot e os assistentes de IA criam a estrutura das rotinas fopen, fprintf e fgets e sinalizam verificaรงรตes de NULL ausentes ou arquivos nรฃo fechados.

E/S de arquivos C

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,

  1. Criaรงรฃo de um arquivo
  2. Abrindo um arquivo
  3. Lendo um arquivo
  4. Escrevendo em um arquivo
  5. 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.

Criar um arquivo na saรญda de um programa em C

Vocรช pode especificar o caminho onde deseja criar seu arquivo

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

Criar um arquivo com um caminho especificado em C

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:

Saรญda da funรงรฃo fputc() em C

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.

O conteรบdo do arquivo fputc_test.txt foi escrito em C.

  1. 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.
  2. 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:

Saรญda da funรงรฃo fputs() em C

Conteรบdo do arquivo fputs_test.txt em C

  1. No programa acima, criamos e abrimos um arquivo chamado fputs_test.txt em modo de gravaรงรฃo.
  2. Apรณs realizarmos uma operaรงรฃo de escrita usando a funรงรฃo fputs(), escrevendo trรชs strings diferentes
  3. 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:

Saรญda da funรงรฃo fprintf() em C

Conteรบdo do arquivo fprintf_test.txt em C

  1. No programa acima, criamos e abrimos um arquivo chamado fprintf_test.txt em modo de gravaรงรฃo.
  2. 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

Leitura de dados de um arquivo em C (saรญda)

  1. 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.
  2. 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.
  3. 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
  4. 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:

Leitura interativa de arquivos e escrita em saรญda C

getc e putc para manipulaรงรฃo de arquivos em C

  1. No programa acima, criamos e abrimos um arquivo chamado demo em modo de gravaรงรฃo.
  2. Apรณs a execuรงรฃo de uma operaรงรฃo de gravaรงรฃo, o arquivo รฉ fechado usando a funรงรฃo fclose.
  3. 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.
  4. Apรณs realizar uma operaรงรฃo de leitura, o arquivo รฉ fechado novamente usando a funรงรฃo fclose.

Perguntas Frequentes

O modo texto traduz os caracteres de nova linha para corresponder ao sistema operacional, enquanto o modo binรกrio, aberto com โ€œrbโ€ ou โ€œwbโ€, grava os bytes exatamente como estรฃo. Use o modo binรกrio para imagens, รกudio ou quaisquer dados em que o layout exato de bytes precise ser preservado.

A funรงรฃo fopen retorna NULL quando um arquivo nรฃo pode ser aberto, por exemplo, devido ร  ausรชncia do arquivo, permissรฃo negada ou disco cheio. Sempre verifique se o ponteiro retornado รฉ NULL antes de ler ou escrever dados; caso contrรกrio, o programa usarรก um ponteiro invรกlido e geralmente travarรก.

O modo de escrita โ€œwโ€ trunca um arquivo existente, apagando seu conteรบdo antes de escrever, e cria o arquivo quando ele nรฃo existe. O modo de acrรฉscimo โ€œaโ€ mantรฉm os dados existentes e adiciona novo conteรบdo ao final, de modo que nada jรก armazenado seja perdido.

A funรงรฃo `fseek` move o ponteiro do arquivo para um deslocamento de byte medido a partir de `SEEK_SET`, `SEEK_CUR` ou `SEEK_END`. A funรงรฃo `ftell` retorna a posiรงรฃo atual do ponteiro em bytes, e a funรงรฃo `rewind` o envia de volta para o inรญcio do arquivo. Juntas, elas permitem acesso aleatรณrio em vez de leitura sequencial.

fgets lรช uma linha inteira, pareping A funรงรฃo `fscanf` lรช tokens formatados, separados por espaรงos, e pode causar estouro de buffer em um array pequeno. Para ler linhas inteiras com seguranรงa, `fgets` รฉ a melhor opรงรฃo.

EOF รฉ uma constante, geralmente -1, que marca o fim de um arquivo. Funรงรตes de leitura como getc, fgetc e fscanf retornam EOF quando nรฃo hรก mais dados disponรญveis, e รฉ por isso que os loops comparam seu resultado com EOF para interromper a leitura.

Sim. Um assistente de programaรงรฃo com IA pode gerar rotinas fopen, fprintf e fgets a partir de um prompt em linguagem natural, explicar cada modo de arquivo e detectar erros como a ausรชncia de uma verificaรงรฃo de valor NULL ou um arquivo nรฃo fechado. Sempre compile e teste o cรณdigo sugerido pela IA antes de confiar nele.

Copiloto do GitHub Gera cรณdigo C para manipulaรงรฃo de arquivos, sugerindo blocos completos de fopen, fputs e fscanf a partir de um breve comentรกrio ou nome de funรงรฃo. Frequentemente, adiciona a chamada fclose correspondente e uma verificaรงรฃo de erros, embora vocรช ainda deva revisar a lรณgica gerada.

Resuma esta postagem com: