English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico de Linguagem C

Controle de Fluxo de Linguagem C

Função do C

Array do C

Ponteiro do C

String do C

Estruturas de Linguagem C

Arquivos de Linguagem C

Outros C

Manual de Referência da Linguagem C

Leitura e escrita de arquivo do C

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.

Por que precisamos de arquivos?

  • 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.

tipos de arquivo

ao manipular arquivos, você deve entender dois tipos de arquivos:

  1. arquivo de texto

  2. arquivo binário

1.arquivo de texto

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.

2.arquivo binário

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.

operações de arquivo

No C, você pode executar quatro operações principais em arquivos:

  1. criar um novo arquivo

  2. abrir um arquivo existente

  3. Fechar arquivo

  4. ler informações e escrever informações no arquivo

manipulação de arquivos

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;

abrir um arquivo-usado para criar e editar

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.

Padrão I / Os modos de abertura em 'O'
ModoO significado do modoDurante a ausência do arquivo
rApenasLeituraModoAbrir.

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.
wAbrir 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.
aAbrir 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.

Fechar arquivo

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.

Ler e escrever arquivos de texto

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.

Exemplo1: Escrever arquivo de texto

#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.

Exemplo2Ler de 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! 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.

Ler e escrever em arquivo binário

No caso dos arquivos binários, as funções fread() e fwrite() são usadas respectivamente para ler e escrever arquivos no disco.

Escrever em arquivo binário

Para escrever em um arquivo binário, é necessário usar a função fwrite(). Essas funções aceitam quatro parâmetros:

  1. Endereço dos dados a serem escritos no disco

  2. Tamanho dos dados a serem escritos no disco

  3. Número de itens deste tipo de dados

  4. Ponteiro para o arquivo onde será escrito.

fwrite(addressData, sizeData, numbersData, pointerToFile);

Exemplo3Usar fwrite() para escrever em arquivo binário

#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.

Ler de um arquivo binário

A função fread() também usa a mesma sintaxe que a função fwrite() acima.4parâmetros.

fread(addressData, sizeData, numbersData, pointerToFile);

Exemplo4: Usar fread() para ler arquivo binário

#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.

Uso de fseek() para obter dados

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.

Sintaxe de fseek()

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.

Diferentes posições em fseek()
PosiçãoSignificado
SEEK_SETDeslocar 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.

Exemplo5: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! 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á.