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,

  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 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.

Como criar um arquivo

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

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

Como criar um arquivo

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:

Gravando em um Arquivo

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.

Gravando em um Arquivo

  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:

Gravando em um Arquivo

Gravando em um Arquivo

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

Gravando em um Arquivo

Gravando em um Arquivo

  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(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

Lendo dados de um arquivo

  1. 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.
  2. 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.
  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 e gravaรงรฃo interativa de arquivos com getc e putc

Leitura e gravaรงรฃo interativa de arquivos com getc e putc

  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.

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.

Resuma esta postagem com: