Dominando I/O de Arquivos em C: Criando, Abrindo e Gerenciando Arquivos
O capítulo anterior explicou os dispositivos de entrada e saída padrão manipulados pela linguagem de programação C. Este capítulo aborda como programadores C podem criar, abrir, fechar arquivos de texto ou binários para 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 OS) para manipular arquivos em seus dispositivos de armazenamento. Este capítulo o guiará pelas chamadas importantes para gerenciamento de arquivos.
Abrindo Arquivos
Você pode usar a função fopen() para criar um novo arquivo ou abrir um arquivo existente. Esta chamada inicializará um objeto do tipo FILE, 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 é um literal de string que você usará para nomear seu arquivo, e o mode de acesso pode ter um dos seguintes valores:
| Nº | Modo e Descrição |
|---|---|
| 1 | r Abre um arquivo de texto existente para leitura. |
| 2 | w Abre um arquivo de texto para escrita. Se não existir, um novo arquivo é criado. Aqui, seu programa começará a escrever conteúdo do início do arquivo. |
| 3 | a Abre um arquivo de texto para escrita em modo de anexação. Se não existir, um novo arquivo é criado. Aqui, seu programa começará a anexar conteúdo ao conteúdo existente do arquivo. |
| 4 | r+ Abre um arquivo de texto para leitura e escrita. |
| 5 | w+ Abre um arquivo de texto para leitura e escrita. Primeiro, trunca o arquivo para comprimento zero se existir, caso contrário, cria um arquivo se não existir. |
| 6 | a+ Abre um arquivo de texto para leitura e escrita. Cria o arquivo se não existir. A leitura começará do início, mas a escrita só pode ser anexada. |
Se você for manipular arquivos binários, 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);
A função fclose() retorna zero em caso de sucesso, ou EOF se houver erro ao fechar o arquivo. Esta função na verdade libera quaisquer 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çalho stdio.h.
Existem várias funções fornecidas pela biblioteca padrão C para ler e escrever um arquivo, caractere por caractere, ou na forma de uma string de comprimento fixo.
Escrevendo em 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() escreve o valor do caractere do argumento c no fluxo de saída referenciado por fp. Retorna o caractere escrito em caso de sucesso, caso contrário EOF se houver erro. Você pode usar as seguintes funções para escrever uma string terminada em null em um fluxo:
int fputs(const char *s, FILE *fp);
A função fputs() escreve a string s no fluxo de saída referenciado por fp. Retorna um valor não negativo em caso de sucesso, caso contrário EOF é retornado em caso de erro. Você também pode usar a função int fprintf(FILE *fp, const char *format, ...) para escrever uma string em um arquivo. Tente o seguinte exemplo.
Certifique-se de que o diretório /tmp esteja disponível. Se não estiver, antes de prosseguir, você deve criar este diretório em sua máquina.
#include <stdio.h>
main() {
FILE *fp;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "Isto é teste para fprintf...\n");
fputs("Isto é teste para fputs...\n", fp);
fclose(fp);
}
Quando o código acima é compilado e executado, cria um novo arquivo test.txt no diretório /tmp e escreve duas linhas usando duas funções diferentes. Vamos ler este arquivo na próxima seção.
Lendo um Arquivo
Abaixo está a função mais simples para ler um único caractere de um arquivo:
int fgetc(FILE *fp);
A função fgetc() lê um caractere do arquivo de entrada referenciado por fp. O valor de retorno é o caractere lido, ou em caso de erro, retorna EOF. A função a seguir permite ler uma string de um fluxo:
char *fgets(char *buf, int n, FILE *fp);
A função fgets() lê até n-1 caracteres do fluxo de entrada referenciado por fp. Copia a string lida para o buffer buf, anexando um caractere null para terminar a string.
Se esta função encontrar um caractere newline '\n' ou o fim do arquivo EOF antes de ler o número máximo de caracteres, retorna apenas os caracteres lidos até aquele ponto, incluindo o caractere de nova linha. Você também pode usar a função int fscanf(FILE *fp, const char *format, ...) para ler strings de um arquivo, mas ela 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, lê o arquivo criado na seção anterior e produz o seguinte resultado:
1: Isto 2: é teste para fprintf... 3: Isto é teste para fputs...
Vamos ver um pouco mais em detalhes o que aconteceu aqui. Primeiro, fscanf() leu apenas Isto 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 chamada fgets() lê a segunda linha completamente.
Funções de I/O Binário
Existem duas funções que podem ser usadas para entrada e saída binária:
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ória - geralmente arrays ou estruturas.
Linguagem C
- Dominando Entrada e Saída (I/O) em C: scanf() e printf() Explicados
- Manipulação de Arquivos em C: Dominando I/O com fopen, fprintf, fread e fseek
- Python File I/O: Dominando Operações de Arquivo, Leitura, Escrita e Gerenciamento
- Axiomtek IPS960‑511‑PoE: Controlador de Visão Robusto All‑In‑One para Inspeção Industrial
- Série acceed EDAM‑4200: Módulos I/O Integrados para Comunicação de Dados Escalável e Confiável
- Dominando Funções em C: Estrutura, Declaração e Boas Práticas
- Entendendo Arquivos de Cabeçalho em C: Tipos, Uso e Boas Práticas
- Placas I/O Explicadas: Como Funcionam e Por Que Importam
- Exportação de Dados no MATLAB: Formatos e Técnicas
- Dominando I/O de Arquivos em C#: Leitura, Escrita e Gerenciamento de Streams