C Manipulação de Arquivos
Manuseio de arquivo C
Neste tutorial, você aprenderá sobre manipulação de arquivos em C. Você aprenderá a lidar com E/S padrão em C usando fprintf(), fscanf(), fread(), fwrite(), fseek() etc. com a ajuda de exemplos.
Um arquivo é um contêiner em dispositivos de armazenamento de computador usado para armazenar dados.
Por que os arquivos são necessários?
- Quando um programa é encerrado, todos os dados são perdidos. Armazenar em um arquivo preservará seus dados mesmo que o programa seja encerrado.
- Se você precisar inserir um grande número de dados, levará muito tempo para inserir todos.
No entanto, se você tiver um arquivo contendo todos os dados, poderá acessar facilmente o conteúdo do arquivo usando alguns comandos em C. - Você pode mover facilmente seus dados de um computador para outro sem nenhuma alteração.
Tipos de arquivos
Ao lidar com arquivos, existem dois tipos de arquivos que você deve conhecer:
- Arquivos de texto
- Arquivos binários
1. Arquivos de texto
Os arquivos de texto são o .txt normal arquivos. Você pode criar facilmente arquivos de texto usando qualquer editor de texto simples, como o Bloco de Notas.
Ao abrir esses arquivos, você verá todo o conteúdo do arquivo como texto simples. Você pode facilmente editar ou excluir o conteúdo.
Eles exigem um esforço mínimo para manter, são facilmente legíveis e fornecem o mínimo de segurança e ocupam maior espaço de armazenamento.
2. Arquivos binários
Arquivos binários são principalmente o .bin arquivos em seu computador.
Em vez de armazenar dados em texto simples, eles os armazenam na forma binária (0's e 1's).
Eles podem conter uma quantidade maior de dados, não são legíveis facilmente e oferecem melhor segurança do que arquivos de texto.
Operações de arquivo
Em C, você pode realizar quatro operações principais em arquivos, texto ou binário:
- Criando um novo arquivo
- Abrindo um arquivo existente
- Fechando um arquivo
- Ler e gravar informações em um arquivo
Trabalhando com arquivos
Ao trabalhar com arquivos, você precisa declarar um ponteiro do tipo arquivo. Esta declaração é necessária para a comunicação entre o arquivo e o programa.
FILE *fptr;
Abrindo um arquivo - para criação e edição
A abertura de um arquivo é realizada usando o
fopen()
função definida no stdio.h
arquivo de cabeçalho. A sintaxe para abrir um arquivo na E/S padrão é:
ptr = fopen("fileopen","mode");
Por exemplo,
fopen("E:\\cprogram\\newprogram.txt","w");
fopen("E:\\cprogram\\oldprogram.bin","rb");
- Vamos supor que o arquivo
newprogram.txt
não existe no localE:\cprogram
. A primeira função cria um novo arquivo chamadonewprogram.txt
e o abre para escrita de acordo com o modo 'w' .
O modo de escrita permite criar e editar (substituir) o conteúdo do arquivo. - Agora vamos supor que o segundo arquivo binário
oldprogram.bin
existe no localE:\cprogram
. A segunda função abre o arquivo existente para leitura em modo binário 'rb' .
O modo de leitura só permite que você leia o arquivo, você não pode escrever no arquivo.
Modo | Significado do Modo | Durante a inexistência do arquivo |
---|---|---|
r | Aberto para leitura. | Se o arquivo não existir, fopen() retorna NULL. |
rb | Aberto para leitura em modo binário. | Se o arquivo não existir, fopen() retorna NULL. |
w | Aberto para escrita. | Se o arquivo existir, seu conteúdo será sobrescrito. Se o arquivo não existir, ele será criado. |
wb | Aberto para escrita em modo binário. | Se o arquivo existir, seu conteúdo será sobrescrito. Se o arquivo não existir, ele será criado. |
a | Abrir para anexar. Os dados são adicionados ao final do arquivo. | Se o arquivo não existir, ele será criado. |
ab | Abre para anexar no 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() retorna NULL. |
rb+ | Aberto para leitura e escrita em modo binário. | Se o arquivo não existir, fopen() retorna NULL. |
w+ | Aberto para leitura e escrita. | Se o arquivo existir, seu conteúdo será sobrescrito. Se o arquivo não existir, ele será criado. |
wb+ | Aberto para leitura e escrita em modo binário. | Se o arquivo existir, seu conteúdo será sobrescrito. Se o arquivo não existir, ele será criado. |
a+ | Aberto para leitura e anexação. | Se o arquivo não existir, ele será criado. |
ab+ | Aberto para leitura e anexação em modo binário. | Se o arquivo não existir, ele será criado. |
Fechando um arquivo
O arquivo (texto e binário) deve ser fechado após a leitura/escrita.
O fechamento de um arquivo é realizado usando o
fclose()
função.
fclose(fptr);
Aqui,
fptr
é um ponteiro de arquivo associado ao arquivo a ser fechado. Ler e gravar em um arquivo de texto
Para ler e escrever em um arquivo de texto, usamos as funções
fprintf()
e fscanf().
Eles são apenas as versões de arquivo de
printf()
e scanf()
. A única diferença é que fprintf()
e fscanf()
espera um ponteiro para a estrutura FILE. Exemplo 1:gravar em um arquivo de texto
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
FILE *fptr;
// use appropriate location if you are using MacOS or Linux
fptr = fopen("C:\\program.txt","w");
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
printf("Enter num: ");
scanf("%d",&num);
fprintf(fptr,"%d",num);
fclose(fptr);
return 0;
}
Este programa pega um número do usuário e armazena no arquivo
program.txt
. Depois de compilar e executar este programa, você pode ver um arquivo de texto
program.txt
criado na unidade C do seu computador. Ao abrir o arquivo, você pode ver o número inteiro inserido. Exemplo 2:Ler de um arquivo de texto
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
FILE *fptr;
if ((fptr = fopen("C:\\program.txt","r")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
fscanf(fptr,"%d", &num);
printf("Value of n=%d", num);
fclose(fptr);
return 0;
}
Este programa lê o inteiro presente no
program.txt
arquivo e o imprime na tela. Se você criou com sucesso o arquivo do Exemplo 1 , a execução deste programa obterá o número inteiro que você inseriu.
Outras funções como
fgetchar()
, fputc()
etc. podem ser usados de maneira semelhante. Ler e gravar em um arquivo binário
Funções
fread()
e fwrite()
são usados para ler e gravar em um arquivo no disco, respectivamente, no caso de arquivos binários. Escrevendo em um arquivo binário
Para escrever em um arquivo binário, você precisa usar o
fwrite()
função. As funções recebem quatro argumentos:- endereço dos dados a serem gravados no disco
- tamanho dos dados a serem gravados no disco
- número desse tipo de dados
- ponteiro para o arquivo em que você deseja gravar.
fwrite(addressData, sizeData, numbersData, pointerToFile);
Exemplo 3:Gravar em um arquivo binário usando fwrite()
#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! opening file");
// Program exits if the file pointer returns NULL.
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
na unidade C. Declaramos uma estrutura
threeNum
com três números - n1, n2 e n3 , e defina-o na função principal como num. Agora, dentro do loop for, armazenamos o valor no arquivo usando
fwrite()
. O primeiro parâmetro recebe o endereço de num e o segundo parâmetro pega o tamanho da estrutura
threeNum
. Como estamos inserindo apenas uma instância de num , o terceiro parâmetro é
1
. E o último parâmetro *fptr
aponta para o arquivo em que estamos armazenando os dados. Por fim, fechamos o arquivo.
Ler de um arquivo binário
Função
fread()
também recebe 4 argumentos semelhantes ao fwrite()
funcionar como acima.
fread(addressData, sizeData, numbersData, pointerToFile);
Exemplo 4:Ler de um arquivo binário usando fread()
#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! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
for(n = 1; n < 5; ++n)
{
fread(&num, sizeof(struct threeNum), 1, fptr);
printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
}
fclose(fptr);
return 0;
}
Neste programa, você lê o mesmo arquivo
program.bin
e percorrer os registros um por um. Em termos simples, você lê um
threeNum
registro de threeNum
tamanho do arquivo apontado por *fptr na estrutura num . Você obterá os mesmos registros inseridos no Exemplo 3 .
Obtendo dados usando fseek()
Se você tiver muitos registros dentro de um arquivo e precisar acessar um registro em uma posição específica, precisará percorrer todos os registros antes dele para obter o registro.
Isso desperdiçará muita memória e tempo de operação. Uma maneira mais fácil de obter os dados necessários pode ser obtida usando
fseek()
. Como o nome sugere,
fseek()
procura o cursor para o dado registro no arquivo. Sintaxe de fseek()
fseek(FILE * stream, long int offset, int whence);
O primeiro fluxo de parâmetro é o ponteiro para o arquivo. O segundo parâmetro é a posição do registro a ser encontrado e o terceiro parâmetro especifica o local onde o deslocamento começa.
De onde | Significado |
---|---|
SEEK_SET | Inicia o deslocamento desde o início do arquivo. |
SEEK_END | Inicia o deslocamento a partir do final do arquivo. |
SEEK_CUR | Inicia o deslocamento da localização atual do cursor no arquivo. |
Exemplo 5:fseek()
#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! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
// Moves the cursor to the end of the file
fseek(fptr, -sizeof(struct threeNum), SEEK_END);
for(n = 1; n < 5; ++n)
{
fread(&num, sizeof(struct threeNum), 1, fptr);
printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);
}
fclose(fptr);
return 0;
}
Este programa começará a ler os registros do arquivo
program.bin
na ordem inversa (do último para o primeiro) e imprime. Linguagem C