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.