Aprenda facilmente a linguagem C Capítulo 10 arquivos

 

Operação de arquivo de linguagem C

① Visão geral do arquivo C ② Ponteiro de tipo de arquivo ③ Abrindo e fechando arquivo ④ Leitura e gravação de arquivo ⑤ Posicionamento de arquivo ⑥ Detecção de erro ⑥ Resumo de entrada e saída de arquivo

Objetivos de aprendizagem deste capítulo

  1. Entenda a diferença entre arquivos de texto e arquivos binários;
  2. Entenda o ponteiro do arquivo FILE * fp;
  3. Capaz de abrir e fechar arquivos com as funções fopen e fclose;
  4. Domine as funções de leitura / gravação de arquivos comumente usadas;

10.1 Visão geral dos arquivos C

Arquivo: uma coleção de dados armazenados em mídia externa, que é a unidade de gerenciamento de dados do sistema operacional.

Objetivo de usar arquivos de dados

1. A mudança do arquivo de dados não causa a mudança do programa - o programa é separado dos dados.

2. Diferentes programas podem acessar os dados no mesmo compartilhamento de dados de arquivo de dados.

3. Pode salvar os dados intermediários ou dados de resultados do programa em execução por um longo tempo.

Classificação de arquivo

De acordo com a estrutura lógica do arquivo:

  1. Arquivo de registro: composto de registros com uma determinada estrutura (comprimento fixo e comprimento variável)
  2. Arquivo de streaming: consiste em uma sequência de dados de caracteres (bytes)

Por meio de armazenamento:

  1. Arquivos comuns: arquivos de mídia de armazenamento (discos, fitas, etc.)
  2. Arquivos de dispositivo: mídia sem armazenamento (teclado, monitor, impressora, etc.)

De acordo com a organização dos dados:

  1. Arquivo de texto: arquivo ASCII, cada byte armazena o código ASCII de um caractere
  2. Arquivo binário: os dados são armazenados como estão na forma de memória

Os arquivos de linguagem C são arquivos de streaming.

O chamado fluxo é uma série de bytes ou caracteres.O início e o fim do fluxo de dados de entrada e saída são controlados apenas pelo programa, não pelos símbolos físicos (como retornos de carro). Esses arquivos são chamados de arquivos de streaming.

Recursos do arquivo de texto: grande capacidade de armazenamento, velocidade lenta, fácil de operar em caracteres

Características do arquivo binário: pequena capacidade de armazenamento, velocidade rápida, resultados intermediários fáceis de armazenar

A diferença entre arquivos de texto e arquivos binários:

① O armazenamento do computador é fisicamente binário, portanto, a diferença entre os arquivos de texto e os arquivos binários não é física, mas lógica. Os dois são diferentes apenas no nível de codificação.

②O fluxo binário economiza espaço do que o fluxo de texto e não há necessidade de converter \ n, o que pode acelerar bastante o fluxo e melhorar a eficiência. Portanto, para um fluxo digital contendo uma grande quantidade de informações digitais, o fluxo binário pode ser usado; para um fluxo contendo uma grande quantidade de informações de caracteres, o fluxo de texto pode ser usado.

③Arquivos de texto são arquivos baseados em codificação de caracteres. As codificações comuns incluem codificação ASCII, codificação UNICODE e assim por diante.

Arquivos binários são arquivos codificados com base em valores.

Método de processamento de arquivo

  1. Sistema de arquivos de buffer: Sistema de arquivos avançado, o sistema abre automaticamente um buffer de memória para os arquivos em uso. Pode reduzir o número de trocas de dados frequentes entre o host e os dispositivos externos
  2. Sistema de arquivos sem buffer: sistema de arquivos de baixo nível, o usuário define o buffer para cada arquivo no programa

10.2 Ponteiro de tipo de arquivo

Tipo de estrutura de arquivo FILE

O sistema de arquivos do buffer cria uma área de informação do arquivo na memória para cada arquivo que está sendo usado. A informação do arquivo é descrita por uma estrutura chamada FILE definida pelo sistema

Definir variáveis ​​de tipo de arquivo

Armazenar informações do arquivo

Como: definir um array do tipo FILE para armazenar várias informações do arquivo: FILE f [5];

Defina a variável de ponteiro de arquivo, aponte para a variável de estrutura do tipo FILE, acesse o arquivo através das informações do arquivo na variável de estrutura.

Como: FILE * fp;

uso:

Quando o arquivo é aberto, o sistema cria automaticamente a estrutura do arquivo e retorna o ponteiro para ele. O programa obtém as informações do arquivo através deste ponteiro e acessa o arquivo

如 : fp = fopen ("a1", "r");

Depois que o arquivo é fechado, sua estrutura de arquivo é liberada

O ponteiro de arquivo definido pode ser usado para apontar para um arquivo!

10.3 Abertura e fechamento de arquivo

As operações de arquivo C são implementadas com funções de biblioteca, incluídas em stdio.h

Uso do arquivo: abrir arquivo → arquivo ler / gravar → fechar arquivo

O sistema abre e fecha automaticamente três arquivos padrão:

  1. Entrada padrão ------ teclado stdin
  2. Saída padrão ------ exibir stdout
  3. Saída de erro padrão ----- exibir stderr

1. Abra o arquivo (função fopen)

Protótipo de função: FILE * fopen (char * name, char * mode)

Método de chamada: fopen ("nome do arquivo", "usando o método do arquivo")

例 : ARQUIVO * fp; fp = fopen ("d: \\ usuário \\ meuarquivo.txt", "r");

Valor de retorno: aberto normalmente, retorna um ponteiro para a estrutura do arquivo; falha ao abrir, retorna NULL 

FILE   *fp;
fp=fopen(“aa.c","w");
if(fp==NULL)
{ 
   printf("File open error!\n");
   exit(0);     /*关闭所有文件终止调用*/
}

r: método de leitura;

w: método de escrita;

a: método anexar;

rb / wb / ab: modo binário;

+: tanto legível quanto gravável

2. Feche o arquivo (função fclose)

Função: Faça a variável do ponteiro do arquivo e o arquivo "desconectar", libere a estrutura do arquivo e o ponteiro do arquivo

FILE  *fp;

fp=fopen(“a.txt”,“r”);

fclose(fp);

Valor de retorno: utilizado para indicar se o arquivo foi fechado corretamente, se o arquivo for fechado com sucesso o valor é 0, caso contrário é -1 (EOF).

O valor de retorno pode ser testado com a função ferror

10.4 Leitura e gravação de arquivos

Depois que o arquivo é aberto, ele pode ser lido e gravado.

Ler / escrever um caractere no arquivo

Função 1.fputc (função putc)

Protótipo de função: int fputc (int c, FILE * fp)

Função: escrever um código de byte c no arquivo apontado por fp

Valor de retorno: normal, retorno c; erro, EOF (-1)

2. função fgetc (função getc)

Protótipo de função: int fgetc (FILE * fp)

Função: ler o código de um byte do arquivo apontado por fp

Valor de retorno: retorna o valor do código lido; EOF (-1) é lido até o final do arquivo ou erro

3.feof função

Método de chamada: feof (fp)

Função: Ao ler um arquivo binário, verifique se o arquivo acabou.

Valor de retorno: se chegar ao final do arquivo, é verdadeiro (diferente de zero) 

Arquivo de texto:  fim é verdadeiro, diferente de zero  

//二进制或文本文件:
#include "stdio.h"
void main()
{ 
	FILE  *fp; 
	char ch;
	fp=fopen("d2.dat","r"); //fopen("文件路径","文件操作");
	ch=fgetc(fp);
	while(ch!=EOF)
	{ 
	 putchar(ch);
	 ch=fgetc(fp);
	}
	fclose(fp);
}

 

Arquivo binário ou de texto:

//二进制或文本文件:

#include "stdio.h"
void main()
{
    FILE  *fp;
    char ch;
    fp=fopen("d2.dat","r");
    ch=fgetc(fp);
    while(!feof(fp))
    {
        putchar(ch);
        ch=fgetc(fp);
    }
    fclose(fp);
}

Insira alguns caracteres do teclado e envie-os para o disco um por um até que um "#" seja inserido.

//从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个“#”为止。
#include <stdio.h>
#include <stdlib.h>
void main(){
	FILE *fp;
	char ch,filename[10];
	scanf("%s",filename);
	if((fp=fopen(filename,"w"))==NULL){
		printf("cannot open file \n");
		exit(0);//终止程序
	}
	ch = getchar();//接收执行scanf时最后输入的回车符
	ch = getchar();//第一个输入的字符被赋给变量ch
	while(ch!='#'){
		fputc(ch,fp);//字符被写入filename表示的文件中
		putchar(ch); //字符被输出到显示器
		ch = getchar();
	}
	putchar(10);//向屏幕输出一个换行符
	fclose(fp); //关闭文件
}

fluxograma:

 

Exemplo Copie as informações de um arquivo de disco para outro arquivo de disco.

//将一个磁盘文件中的信息复制到另一个磁盘文件中。
#include <stdio.h>
#include <stdlib.h>
void main(){
	FILE *in,*out;
	char ch,infile[10],outfile[10];
	printf("Enter the infile name:\n");
	scanf("%s",infile);
	printf("Enter the outfile name:\n");
	scanf("%s",outfile);
	if((in=fopen(infile,"r"))==NULL){
		printf("Cannot open infile.\n");
		exit(0);
	}
	if((out=fopen(outfile,"w"))==NULL){
		printf("Cannot open outfile.\n");
		exit(0);
	}
	//将infile的内容复制到outfile
	while(!feof(in))
		fputc(fgetc(in),out);
	fclose(in);
	fclose(out);
}	

Exemplo Usando o parâmetro principal, insira os dois nomes de arquivo juntos ao inserir a linha de comando. 

#include <stdio.h>
#include <stdlid.h>
void main(int argc,char *argv[ ])
{ 
	FILE *in, *out;
    char ch;
    if(argc!=3)
     { 
		printf("You forgot to enter a filename\n");
        exit(0); 
	}
  
	if((in = fopen(argv[1], "r"))== NULL)
    { 
		printf("Cannot open infile.\n");
        exit(0);  
	}
    if ((out = fopen(argv[2], "w"))== NULL)
    { 
		printf("Cannot open outfile.\n");
        exit(0);  
	}
    while (!feof(in))  
		fputc(fgetc(in), out);
    fclose(in);   
	fclose(out);  
}

Quando o nome do arquivo executável for: a.exe, digite a linha de comando: C: \> a file1.c file2.c e: copie o conteúdo de file1 para file2

Funções de entrada e saída do bloco de dados:

4. A forma de chamada geral de fread e fwrite:

  • fread (buffer, tamanho, contagem, fp);
  • fwrite (buffer, tamanho, contagem, fp);

Descrição do parâmetro:

  1. buffer: O primeiro endereço de armazenamento do bloco de dados a ser lido ou o endereço inicial do bloco de dados a ser gerado .
  2. tamanho: o tamanho (número de bytes) de cada bloco de dados a ser lido / escrito
  3. contagem: o número de blocos de dados a serem lidos / gravados
  4. fp: Ponteiro de arquivo a ser lido / escrito. Valor de retorno: sucesso, retorna o valor de contagem; erro ou fim de arquivo, valor 0.

fread e fwrite são geralmente usados ​​para a entrada / saída de arquivos binários.Se o arquivo for aberto na forma binária, qualquer tipo de dado pode ser lido e escrito com fread ou fwrite .

Como: fread (f, 4, 2, fp)

Exemplo Insira os dados de 4 alunos com o teclado, salve-os no disco e exiba o conteúdo do arquivo do disco na tela.

#include <stdio.h>
#define SIZE 4
struct student_type
{ 
	char name[10];
    int num;
    int age;
    char addr[15];
}stud[SIZE];
void main()
{ 
	void save();
	void display();
	int i;
	for(i=0;i<SIZE;i++)
		scanf("%s%d%d%s",stud[i].name,&stud[i].num, &stud[i].age,stud[i].addr);
	save();
	display(); 
}
void save()
{ 
	FILE *fp;
	int  i;
	// 文件必须是以“二进制”打开的,
	if((fp=fopen("d:\\stu_list","wb"))==NULL)
	{ 
	   printf("cannot open file\n");
	   return;
	}
	for(i=0;i<SIZE;i++)
	  if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)
		 printf("file write error\n");
	fclose(fp);
}
void display()
{ 
	FILE *fp;
	int  i;
	if((fp=fopen("d:\\stu_list","rb"))==NULL)
	{ 
		printf("cannot open file\n");   
		return;
	}
	for(i=0;i<SIZE;i++)
	{ 
		fread(&stud[i],sizeof(struct student_type),1,fp);
		printf("%-10s %4d %4d %-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
	}
	fclose(fp);
}

Funções para ler e gravar arquivos em um formato especificado:

5. O formato de chamada geral de fprintf e fscanf:

  1. fscanf (fp, string de formato, lista de entrada);
  2. fprintf (fp, string de formato, lista de saída);

Valor de retorno: sucesso, retorna o número de E / S; erro ou fim do arquivo, retorna EOF. Como a entrada e a saída precisam ser convertidas do código ASCII para a forma binária, isso leva mais tempo.

fscanf (fp, "% d,% f", & i, & t); / * Se houver 3, 4,5 no arquivo, então leia 3 em i, 4,5 leia em t * /

fprintf (fp, "% d,% 6.2f", i, t); / * Grave i e t no arquivo fp no formato% d,% 6.2f * /

void save()
{  
   FILE *fp;
   int  i;
   if((fp=fopen("d:\\stu_list","w"))==NULL)
   { 
        printf("cannot open file\n");
        return;
   }
   for(i=0;i<SIZE;i++)
      fprintf(fp,"%s %d %d %s",stud[i].name,
            stud[i].num,stud[i].age,stud[i].addr);
   fclose(fp);
}
void display()
{ 
   FILE *fp;
   int  i;
   if((fp=fopen("d:\\stu_list","r"))==NULL)
   { 
       printf("cannot open file\n");   return;}
       for(i=0;i<SIZE;i++)
       { 
           fscanf(fp,"%s %d %d %s",stud[i].name,
                   stud[i].num,stud[i].age,stud[i].addr);         
           printf("%-10s %4d %4d %-15s\n",stud[i].name,
                   stud[i].num,stud[i].age,stud[i].addr);
       }
       fclose(fp);
    }
}

Outras funções de leitura e gravação

6. funções putw e getw

Função: Na forma binária, lê e grava um inteiro do tipo int no arquivo de disco, 2 bytes.

Valor de retorno: sucesso: o valor inteiro escrito; falha: EOF.            

Tais como: putw (10, fp);                  

 i = getw (fp);

7.fgets e funções fputs

Formato:

fgets (str, n, fp);   (matriz de caracteres str, n-1 caracteres)                

fputs (string, fp); ("\ 0" não é saída)

Função: ler / escrever uma string do arquivo apontado por fp

Valor de retorno: fgets retorna o primeiro endereço da string quando normal; erro ou fim do arquivo, NULL fputs retorna o último caractere escrito quando normal; o erro é EOF

Exemplo Leia uma seqüência de caracteres do teclado e armazene-a em um arquivo e, em seguida, leia de volta do arquivo para exibir

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{ 
	FILE  *fp;
	char  string[81];
	if((fp=fopen("1.txt","w"))==NULL)
	{ 
		printf("cann't open file");
		exit(0); 
	}
	while(strlen(gets(string))>0)
	{ 
		fputs(string,fp);
		fputs("\n",fp); 
	}
	fclose(fp);
	if((fp=fopen("1.txt","r"))==NULL)
	{ 
		printf("cann't open file");
		exit(0); 
	}
	while(fgets(string,81,fp)!=NULL)
	   fputs(string,stdout);
	fclose(fp); 
}

10.5 Localização do arquivo

Vários conceitos

Ponteiro de posição do arquivo ----- ponteiro para a posição atual de leitura e gravação, a posição específica é determinada pelo método de abertura do arquivo.

  • "R" "w": aponta para o cabeçalho do arquivo
  • "A": aponta para o final do arquivo

Método de leitura e gravação

  • Leitura e escrita sequencial: O ponteiro de posição move-se na ordem da posição do byte.
  • Leitura e escrita aleatórias: O ponteiro de posição pode ser movido para qualquer posição conforme necessário.

Função 1.rewind

Protótipo de função: void rewind (FILE * fp)

Função: redefina o ponteiro de posição do arquivo para o início do arquivo

Valor de retorno: Nenhum

Exemplo de exibição e cópia de um arquivo de disco duas vezes

#include <stdio.h>
void main()
{ 
   FILE *fp1,*fp2;
   fp1=fopen("c:\\tc\\user\\ch12_4.c","r");
   fp2=fopen("d:\\tc\\user\\ch12_41.c","w");
   while(!feof(fp1))  
       putchar(getc(fp1));
   rewind(fp1);
   while(!feof(fp1))  
       putc(getc(fp1),fp2);
   fclose(fp1);   
   fclose(fp2);
}

2. função fseek e leitura e gravação aleatórias

Formulário de chamada: fseek (ponteiro de tipo de arquivo, deslocamento, ponto de partida)

Função: altera a posição do ponteiro de posição do arquivo

Valor de retorno: sucesso, retorno 0; falha, retorno valor diferente de zero

Exemplo: Existem 10 dados de alunos no arquivo, insira os dados individuais de um aluno no computador e exiba-os na tela

#include <stdlid.h>
#include <stdio.h>
struct student_type
{ 
   char name[10];
   int num;
   int age;
   char sex;
}stud[10];

void main()
{ 
   FILE *fp;
   int  i;
   if((fp=fopen("stud_dat","rb"))==NULL)
   { 
       printf("cannot open file\n");  
       exit(0);
   }
   for(i=0;i<10;i+=2)
   { 
       fseek(fp,i*sizeof(struct student_type),0);//
       fread(&stud[i],sizeof(struct student_type), 1,fp);
       printf("%s %d %d %c\n",stud[i].name,stud[i].num,
                    stud[i].age,stud[i].sex);
   }
   fclose(fp);
}

3. função ftell

Protótipo de função: long ftell (FILE * fp)

Função: obtém a posição atual do ponteiro de posição no arquivo de streaming (indicada pelo deslocamento em relação ao início do arquivo)

Valor de retorno: retorna a posição atual do ponteiro; falha, retorna -1L

//例  求文件长度
#include"stdio.h"
void main()
{ 
	FILE *fp;
	char filename[80];
	long length;
	gets(filename);
	fp=fopen(filename,"rb");
	if(fp==NULL)
	   printf("file not found!\n");
	else
	{ 
		fseek(fp,0L,SEEK_END);
	    length=ftell(fp);
	    printf("Length of File is %1d bytes\n",length);
	    fclose(fp);  
	}
}

10.6 Detecção de erros

1. função deferror:

  • Arquivo de teste para erros
  • Forma de chamada: ferror (fp);
  • Valor de retorno: sem erro, 0; erro, não 0
  • Explique que toda vez que a função de entrada e saída do arquivo é chamada, um novo valor de função ferror é gerado, então ele deve ser testado a tempo quando fopen abre o arquivo, o valor inicial da função ferror é automaticamente definido como 0

2. função clara

Formulário de chamada: clearerr (fp);

Função: defina o sinalizador de erro do arquivo como 0, sem valor de retorno.

Nota: Após um erro, o sinalizador de erro permanecerá até clearerr (fp) ou retroceder ou qualquer outra função de entrada e saída ser ajustada para o mesmo arquivo

例   ferror()与clearerr()举例
#include <stdio.h>
int  main(void)
{ FILE *stream;
   stream = fopen("DUMMY.FIL", "w");
   getc(stream);
   if (ferror(stream))
     { printf("Error reading from DUMMY.FIL\n");
        clearerr(stream);
     }
   if(!ferror(stream))
       printf("Error indicator cleared!");
   fclose(stream);
   return 0;
}

10.7 Resumo da entrada e saída do arquivo

  1. Ao usar um arquivo, você deve primeiro definir um ponteiro de arquivo:
  2. FILE * fp; Em seguida, use o ponteiro para manipular o arquivo correspondente;
  3. Por meio da função fopen, o ponteiro de arquivo fp é conectado ao arquivo correspondente, e a conexão entre fp e o arquivo é cortada por meio da função fclose;
  4. O arquivo pode ser aberto em modo texto (padrão ou "t"), ou em modo binário ("b");
  5. Se você processar o arquivo um caractere por vez, precisará usar a função fgetc ou fputc;
  6. Se você processar o arquivo uma linha por vez, poderá usar a função fgets ou fputs;
  7. Se você processar os arquivos uma estrutura de cada vez, poderá usar as funções fread e fwrite (principalmente arquivos binários);
  8. As funções fscanf e fprintf são amplamente utilizadas e devem ser dominadas.

As notas neste artigo são do projeto do programa PPT de C de Tan Haoqiang, eu adoro aprender haha!

Se você acha que a escrita é boa, por favor, goste ~

Acho que você gosta

Origin blog.csdn.net/weixin_41987016/article/details/105879508
Recomendado
Clasificación