English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá como manipular arquivos em linguagem C. Você aprenderá através de exemplos como usar fprintf(), fscanf(), fread(), fwrite(), fseek() e outros para manipular entrada/saída padrão em linguagem C./O.
Os arquivos são recipientes usados em dispositivos de armazenamento de computadores para armazenar dados.
Quando o programa termina, todos os dados serão perdidos. Mesmo que o programa termine, os dados armazenados no arquivo serão mantidos.
Se for necessário inserir uma grande quantidade de dados, levará muito tempo para inserir todos.
No entanto, se você tiver um arquivo contendo todos os dados, você pode acessar o conteúdo do arquivo usando alguns comandos no C.
Você pode transferir dados de um computador para outro sem a necessidade de fazer qualquer alteração.
ao manipular arquivos, você deve entender dois tipos de arquivos:
arquivo de texto
arquivo binário
Os arquivos de texto são arquivos normais.txtarquivo. Você pode criar arquivos de texto usando qualquer editor de texto simples (por exemplo, Bloco de Notas).
Ao abrir esses arquivos, você verá todo o conteúdo do arquivo em formato de texto puro. Você pode editar ou excluir o conteúdo facilmente.
Eles são fáceis de ler, requerem o mínimo de manutenção, oferecem a menor segurança e ocupam mais espaço de armazenamento.
Os arquivos binários são principalmente usados no.binarquivo.
Eles não armazenam dados em formato de texto puro, mas em formato binário (0 e1) armazenar dados.
em comparação com arquivos de texto, eles podem conter mais dados, são difíceis de ler e oferecem melhor segurança.
No C, você pode executar quatro operações principais em arquivos:
criar um novo arquivo
abrir um arquivo existente
Fechar arquivo
ler informações e escrever informações no arquivo
ao manipular arquivos, é necessário declarar um ponteiro do tipo de arquivo. A comunicação entre o arquivo e o programa requer essa declaração.
FILE *fptr;
Usar a função fopen() definida no cabeçalho stdio.h para abrir um arquivo.
no padrão I / A sintaxe para abrir um arquivo no C é:
ptr = fopen("fileopen","mode");
Por exemplo,
fopen("E:\\cprogram\\newprogram.txt","w"); fopen("E:\\cprogram\\oldprogram.bin","rb");
Suponha que o arquivo newprogram.txt não exista no caminho E:\cprogram. A primeira função cria um novo arquivo chamado newprogram.txt e conforme'w'O modo de abertura abre o arquivo para escrita.
O modo de escrita permite que você crie e edite (substitua) o conteúdo do arquivo.
Agora, suponha que o segundo arquivo binário oldprogram.bin exista no caminho E:\cprogram. A segunda função abre um arquivo existente, em modo binário'rb'Leitura.
O modo de leitura permite que você leia o arquivo, mas não escreva no arquivo.
Modo | O significado do modo | Durante a ausência do arquivo |
---|---|---|
r | ApenasLeituraModoAbrir. | Se o arquivo não existir, fopen() retornará NULL. |
rb | Abrir para leitura em modo binário. | Se o arquivo não existir, fopen() retornará NULL. |
w | Abrir arquivo de texto, permitindo escrita no arquivo. | Abrir um arquivo de texto, permitindo escrita no arquivo. Se o arquivo não existir, um novo arquivo será criado. Aqui, seu programa escreverá conteúdo do início do arquivo. Se o arquivo existir, ele será truncado para zero comprimento e reescrito. |
wb | Abrir o arquivo para escrita em modo binário. | Se o arquivo existir, seu conteúdo será substituído. Se o arquivo não existir, ele será criado. |
a | Abrir para adição. Os dados são adicionados ao final do arquivo. | Se o arquivo não existir, ele será criado. |
ab | Abrir para adição em modo binário. Os dados são adicionados ao final do arquivo. | Se o arquivo não existir, ele será criado. |
r+ | Aberto para leitura e escrita. | Se o arquivo não existir, fopen() retornará NULL. |
rb+ | Abrir para leitura e escrita em modo binário. | Se o arquivo não existir, fopen() retornará NULL. |
w+ | Abrir um arquivo de texto, permitindo leitura e escrita no arquivo | Se o arquivo existir, seu conteúdo será substituído. Se o arquivo não existir, ele será criado. |
wb+ | Abrir para leitura e escrita em modo binário. | Se o arquivo existir, seu conteúdo será substituído. Se o arquivo não existir, ele será criado. |
a+ | Abrir para leitura e adição. | Se o arquivo não existir, ele será criado. |
ab+ | Abrir para leitura e adição em modo binário. | Se o arquivo não existir, ele será criado. |
Ler/Após a escrita, o arquivo deve ser fechado (arquivo de texto e arquivo binário).
Pode-se fechar o arquivo usando a função fclose().
fclose(fptr);
Aqui, fptr é o ponteiro de arquivo associado ao arquivo a ser fechado.
Para ler e escrever arquivos de texto, usamos as funções fprintf() e fscanf().
Eles são apenas versões de arquivo do printf() e scanf(). A única diferença é que fprint() e fscanf() precisam de um ponteiro para a estrutura FILE.
#include <stdio.h> #include <stdlib.h> int main() { int num; FILE *fptr; // Se você usar MacOS ou Linux, use o caminho correto fptr = fopen("C:\\program.txt","w"); se(fptr == NULL) { printf("Error!"); exit(1); } printf("Enter num: "); scanf("%d",&num); fprintf(fptr,"%d",num); fclose(fptr); return 0; }
Este programa obtém um número do usuário e o armazena no arquivo program.txt.
Após compilar e executar este programa, você pode ver o arquivo de texto program.txt criado no drive C do computador. Ao abrir o arquivo, você pode ver o inteiro de entrada.
#include <stdio.h> #include <stdlib.h> int main() { int num; FILE *fptr; if ((fptr = fopen("C:\\program.txt","r")) == NULL){ printf("Error! Abertura do arquivo"); //Se o ponteiro do arquivo retornar NULL, o programa sai. exit(1); } fscanf(fptr,"%d", &num); printf("Value of n=%d", num); fclose(fptr); return 0; }
Este programa lê o inteiro existente no arquivo program.txt e o imprime na tela.
Se você estiver lendoExemplo1O arquivo foi criado com sucesso, ao executar este programa, você será fornecido com o inteiro de entrada.
Outras funções, como fgetchar() e fputc(), podem ser usadas de maneira semelhante.
No caso dos arquivos binários, as funções fread() e fwrite() são usadas respectivamente para ler e escrever arquivos no disco.
Para escrever em um arquivo binário, é necessário usar a função fwrite(). Essas funções aceitam quatro parâmetros:
Endereço dos dados a serem escritos no disco
Tamanho dos dados a serem escritos no disco
Número de itens deste tipo de dados
Ponteiro para o arquivo onde será escrito.
fwrite(addressData, sizeData, numbersData, pointerToFile);
#include <stdio.h> #include <stdlib.h> struct threeNum { int n1, n2, n3; }); int main() { int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\\program.bin","wb")) == NULL){ printf("Error! Abertura do arquivo"); // Se o ponteiro do arquivo retornar NULL, o programa sai. exit(1); } for(n = 1; n < 5; ++n); { num.n1 = n; num.n2 = 5*n; num.n3 = 5*n + 1; fwrite(&num, sizeof(struct threeNum), 1, fptr); } fclose(fptr); return 0; }
Neste programa, criamos um novo arquivo program.bin no drive C.
Declaramos um número n com três dígitos1, n2e n3da estrutura threeNum, e a definimos como num na função principal.
Agora, dentro do loop for, usamos fwrite() para armazenar os valores no arquivo.
O primeiro parâmetro aceita o endereço de num, o segundo parâmetro aceita o tamanho da estrutura threeNum.
Como estamos inserindo apenas uma instância de num, o terceiro parâmetro é1O último parâmetro* fptr aponta para o arquivo onde vamos armazenar os dados.
Por fim, fechamos o arquivo.
A função fread() também usa a mesma sintaxe que a função fwrite() acima.4parâmetros.
fread(addressData, sizeData, numbersData, pointerToFile);
#include <stdio.h> #include <stdlib.h> struct threeNum { int n1, n2, n3; }); int main() { int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\\program.bin","rb")) == NULL){ printf("Error! Abertura do arquivo"); //Se o ponteiro do arquivo retornar NULL, o programa sai. exit(1); } for(n = 1; n < 5; ++n); { fread(&num, sizeof(struct threeNum), 1, fptr); printf("\n"1: %d\t\n2: %d\t\n3: %d", num.n1, num.n2, num.n3); } fclose(fptr); return 0; }
Neste programa, você lê o mesmo arquivo program.bin e navega por registros um a um.
Em termos simples, você estará lendo* Ler um threeNum do tamanho de threeNum do arquivo apontado por fptr*Ler um threeNum do tamanho de threeNum do arquivo apontado por fptr para a estrutura num.
Você obterá o mesmoExemplo3emInserir registros com o mesmo registro.
Se há muitos registros no arquivo e é necessário acessar um registro específico, é necessário percorrer todos os registros para obter o registro.
Isso consumirá uma quantidade significativa de memória e tempo de operação. O uso de fseek() permite obter facilmente os dados necessários.
Como o nome sugere, fseek() coloca o cursor no registro especificado no arquivo.
fseek(FILE * stream, long int offset, int whence);
O primeiro parâmetro stream é um ponteiro para o arquivo. O segundo parâmetro é a posição do registro a ser encontrado, e o terceiro parâmetro especifica a posição de início do deslocamento.
Posição | Significado |
---|---|
SEEK_SET | Deslocar a partir do início do arquivo. |
SEEK_END | Deslocar a partir do final do arquivo. |
SEEK_CUR | Deslocar a posição do cursor a partir da localização atual do cursor no arquivo. |
#include <stdio.h> #include <stdlib.h> struct threeNum { int n1, n2, n3; }); int main() { int n; struct threeNum num; FILE *fptr; if ((fptr = fopen("C:\\program.bin","rb")) == NULL){ printf("Error! Abertura do arquivo"); //Se o ponteiro do arquivo retornar NULL, o programa sai. exit(1); } // Mover o cursor para o final do arquivo. fseek(fptr, -sizeof(struct threeNum), SEEK_END); for(n = 1; n < 5; ++n); { fread(&num, sizeof(struct threeNum), 1, fptr); printf("\n"1: %d\t\n2: %d\t\n3: %d\n", num.n1, num.n2, num.n3); fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR); } fclose(fptr); return 0; }
O programa começará a ler registros do arquivo program.bin em ordem inversa (do último para o primeiro) e imprimirá.