C - Arquivo I / O

O último capítulo explicou os dispositivos de entrada e saída padrão tratados pela linguagem de programação C. Este capítulo cobre como os programadores C podem criar, abrir, fechar texto ou arquivos binários para seu armazenamento de dados.

Um arquivo representa uma sequência de bytes, independentemente de ser um arquivo de texto ou binário. A linguagem de programação C fornece acesso a funções de alto nível, bem como chamadas de baixo nível (nível do sistema operacional) para manipular arquivos em seus dispositivos de armazenamento. Este capítulo o levará através das chamadas importantes para o gerenciamento de arquivos.

Abrindo arquivos

Você pode usar o fopen( )função para criar um novo arquivo ou para abrir um arquivo existente. Esta chamada irá inicializar um objeto do tipoFILE, que contém todas as informações necessárias para controlar o fluxo. O protótipo desta chamada de função é o seguinte -

FILE *fopen( const char * filename, const char * mode );

Aqui, filename é uma string literal, que você usará para nomear seu arquivo e acessar mode pode ter um dos seguintes valores -

Sr. Não. Modo e descrição
1

r

Abre um arquivo de texto existente para fins de leitura.

2

w

Abre um arquivo de texto para escrita. Se não existir, um novo arquivo será criado. Aqui, o seu programa começará a escrever o conteúdo desde o início do arquivo.

3

a

Abre um arquivo de texto para escrever no modo de acréscimo. Se não existir, um novo arquivo será criado. Aqui, seu programa começará a anexar conteúdo ao conteúdo do arquivo existente.

4

r+

Abre um arquivo de texto para leitura e escrita.

5

w+

Abre um arquivo de texto para leitura e escrita. Ele primeiro trunca o arquivo para comprimento zero se ele existir; caso contrário, cria um arquivo se ele não existir.

6

a+

Abre um arquivo de texto para leitura e escrita. Ele cria o arquivo se ele não existir. A leitura começará do início, mas a escrita só pode ser anexada.

Se você for lidar com arquivos binários, então usará os seguintes modos de acesso em vez dos mencionados acima -

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

Fechando um Arquivo

Para fechar um arquivo, use a função fclose (). O protótipo desta função é -

int fclose( FILE *fp );

o fclose(-) função retorna zero em caso de sucesso, ou EOFse houver um erro ao fechar o arquivo. Na verdade, esta função libera todos os dados ainda pendentes no buffer para o arquivo, fecha o arquivo e libera qualquer memória usada para o arquivo. O EOF é uma constante definida no arquivo de cabeçalhostdio.h.

Existem várias funções fornecidas pela biblioteca padrão C para ler e gravar um arquivo, caractere por caractere, ou na forma de uma string de comprimento fixo.

Gravando um Arquivo

A seguir está a função mais simples para escrever caracteres individuais em um fluxo -

int fputc( int c, FILE *fp );

A função fputc()grava o valor do caractere do argumento c no fluxo de saída referenciado por fp. Ele retorna o caractere escrito com sucesso, caso contrárioEOFse houver um erro. Você pode usar as seguintes funções para escrever uma string terminada em null em um stream -

int fputs( const char *s, FILE *fp );

A função fputs() escreve a string spara o fluxo de saída referenciado por fp. Ele retorna um valor não negativo em caso de sucesso, caso contrárioEOFé retornado em caso de algum erro. Você pode usarint fprintf(FILE *fp,const char *format, ...)função também para escrever uma string em um arquivo. Experimente o seguinte exemplo.

Assegure-se de ter /tmpdiretório disponível. Se não estiver, antes de continuar, você deve criar este diretório em sua máquina.

#include <stdio.h>

main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

Quando o código acima é compilado e executado, ele cria um novo arquivo test.txtno diretório / tmp e escreve duas linhas usando duas funções diferentes. Vamos ler este arquivo na próxima seção.

Lendo um arquivo

A seguir está a função mais simples de ler um único caractere de um arquivo -

int fgetc( FILE * fp );

o fgetc()função lê um caractere do arquivo de entrada referenciado por fp. O valor de retorno é o caractere lido, ou em caso de erro, ele retornaEOF. A função a seguir permite ler uma string de um fluxo -

char *fgets( char *buf, int n, FILE *fp );

As funções fgets()lê até n-1 caracteres do fluxo de entrada referenciado por fp. Ele copia a string lida no bufferbuf, anexando um null caractere para encerrar a string.

Se esta função encontrar um caractere de nova linha '\ n' ou o final do arquivo EOF antes de terem lido o número máximo de caracteres, ela retornará apenas os caracteres lidos até aquele ponto, incluindo o caractere de nova linha. Você também pode usarint fscanf(FILE *fp, const char *format, ...) função para ler strings de um arquivo, mas para de ler após encontrar o primeiro caractere de espaço.

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);

}

Quando o código acima é compilado e executado, ele lê o arquivo criado na seção anterior e produz o seguinte resultado -

1 : This
2: is testing for fprintf...

3: This is testing for fputs...

Vamos ver um pouco mais detalhadamente o que aconteceu aqui. Primeiro,fscanf() ler apenas This porque depois disso, encontrou um espaço, a segunda chamada é para fgets()que lê a linha restante até encontrar o fim da linha. Finalmente, a última chamadafgets() lê a segunda linha completamente.

Funções Binárias de E / S

Existem duas funções, que podem ser usadas para entrada e saída binárias -

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
              
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

Ambas as funções devem ser usadas para ler ou escrever blocos de memórias - geralmente arrays ou estruturas.