Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

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?


Tipos de arquivos


Ao lidar com arquivos, existem dois tipos de arquivos que você deve conhecer:
  1. Arquivos de texto
  2. 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:
  1. Criando um novo arquivo
  2. Abrindo um arquivo existente
  3. Fechando um arquivo
  4. 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");
Modos de abertura em E/S padrão
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:
  1. endereço dos dados a serem gravados no disco
  2. tamanho dos dados a serem gravados no disco
  3. número desse tipo de dados
  4. 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.
Diferente de onde em fseek()
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

  1. Classe de arquivo Java
  2. Uma introdução aos arquivos STL
  3. Operações de E/S de arquivo Verilog
  4. C - E/S de arquivo
  5. C - Arquivos de cabeçalho
  6. C - Tratamento de erros
  7. Arquivos e fluxos C++
  8. Manipulação de sinal C++
  9. C# - Tratamento de Exceções
  10. C# - E/S de arquivo