Operación en archivo (explicación detallada de Ju Wudi)

La manipulación de archivos es un capítulo tedioso y lleno de conceptos en el lenguaje C elemental. Este artículo adopta el método de escritura del total primero y luego la partitura . Es adecuado para programadores que aprenden a leer el lenguaje C. Creo que el contenido de este artículo ha aparecido generalmente en los temas de operación de archivos que ha leído. Si crees que este artículo resume con más detalle, no olvides recopilar y prestar atención (creo que la expansión es bastante completa), estoy un poco y espero acompañarte a trabajar duro para escalar el pico en el próximos años sumergidos!

contenido

tipo de archivo, nombre de archivo. sistema de archivos

Resumen de funciones principales

 Método de apertura de archivo principal

fopen() y flcose()

fgetc() y fputc()

fgets() y fputs()

fread() y fwrite()

Acerca del mal uso de feof()

fin


tipo de archivo, nombre de archivo. sistema de archivos

Hay dos tipos de archivos de lenguaje C: archivos binarios (demo.bin) y archivos de texto (demo.txt).

El nombre del archivo consta de tres partes: ruta del archivo + tronco del nombre del archivo + sufijo del archivo, por ejemplo: D:\shilv\test.txt

También hay dos tipos de sistemas de archivos en lenguaje C: con búfer (use punteros de archivo para identificar archivos) y sin búfer (sin punteros de archivo, use números enteros llamados números de archivo para identificar archivos). Este artículo presenta principalmente el sistema de archivos almacenados en búfer .

En el sistema de archivos almacenados en búfer , el concepto clave es "puntero de tipo de archivo", denominado "puntero de archivo".

El puntero de archivo pf (algunos libros de texto son fp, y la única diferencia con pf en este artículo es que las letras son diferentes) es una variable de puntero que apunta al tipo de estructura FILE , que se define como

FILE* pf

Resumen de funciones principales

función prototipo de función Uso general
fopen() ARCHIVO *fopen( const char * nombre de archivo , const char * modo )
FILE* pf = fopen("test.txt", "r");

cerrar() int fclose ( ARCHIVO * secuencia )
fclose(pf);

fgetc()

int fgetc ( ARCHIVO * flujo )

fgetc(pf);

fputc() int fputc( int c , ARCHIVO * corriente )
fputc('b', pf);

fgets() char *fgets( char * string , int n , FILE * stream )
fgets(buf, 1024, pf);

fputs() int fputs( const char * string , FILE * stream )
fputs("hello", pf);

feof()

int feof ( ARCHIVO * corriente )

while(!feof(pf));

fscanf()

int fscanf( ARCHIVO * secuencia , const char * formato [, argumento ]... )

fscanf(stdin, "%d %f %s", &(s.n), &(s.score), s.arr);

fprintf()

int fprintf( ARCHIVO * secuencia , const char * formato [, argumento ]... )

fprintf(stdout, "%d %f %s", s.n, s.score, s.arr);

miedo()

size_t fread( void *buffer, size_t size, size_t count, FILE *stream )

fread(&tmp, sizeof(struct S), 1, pf);

fwrite() size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream )
fwrite(stu,sizeof(STUDENT),n,fp);

strerror() char *strerror( int errnum )
printf("%s\n", strerror(errno));

perror()

void perror( const char *string )

perror("open file test2.txt");

sscanf() int sscanf( const char *buffer, const char *format [, argument ] ... )
sprintf() int sprintf( char *buffer, const char *format [, argument] ... )
fseek()

int fseek( FILE *stream, long offset, int origin )

fseek(pf, 5, SEEK_SET);

ftell()

long ftell( FILE *stream )

int pos = ftell(pf);

rewind() void rewind( FILE *stream )
rewind( stream );
fflush()

int fflush( FILE *stream )   

fflush(stdin);

如上只是对函数作出整理方便读者了解个大概,具体函数功能如何下面将会一一讲解。

 主要文件打开方式

文件使用方式 含义 如果指定文件不存在
“r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件(会把文本里原来的内容清空哦) 建立一个新的文件
a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

不用记,把"r" "w" "a"这三个理解透彻就能融会贯通啦,多说一嘴,有"b"的话就是打开二进制文件。

  

fopen()与flcose()

ANSIC 规定使用fopen函数来打开文件,fclose函数来关闭文件。

FILE *fopen( const char *filename, const char *mode )

fopen()有两个参数,第一个参数filename代表文件名,第二个形参mode表示文件打开方式。

int fclose( FILE *stream )

函数fclose()返回一个整形数值,当文件关闭成功时,返回0值,否则返回一个非0值。参考代码如下:

#include <stdio.h>
int main()
{
	FILE* pf = fopen("test2.txt", "r");
	if (pf == NULL)
	{
		return 0;        //又出现了判断文件打开成功与否
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

如上所示,为什么要判断文件打开成功与否呢?跟上篇动态内存分配类似,是因为文件并不是每次都能呗成功地打开的。例如,当文件不存在或者已经损坏时,文件打开就会失败。这是一个至关重要的点!

fgetc()与fputc()

int fgetc( FILE *stream )

fgetc()用于从一个只读或读写方式打开的文件上读字符,该函数较为简单,用法如下:

#include <stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	int ch = fgetc(pf);
	printf("%c", ch);
	ch = fgetc(pf);
	printf("%c", ch);
	ch = fgetc(pf);
	printf("%c", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

实现前:在文本输入x个字符

实现后:文本上的字符就会呗读取到控制台上 

 

int fputc( int c, FILE *stream

fputs()用于将一个字符写到一个文件上。用法如下:

#include <stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "w");
	if (pfWrite == NULL)
	{
		return 0;
	}
	fputc('b', pf);
	fputc('i', pf);
	fputc('t', pf);
	fclose(pf);
	pf = NULL;
	return 0;
}

实现前:

实现后:

fgetc()和fputc()还能同时使用

#include <stdio.h>
int main()
{
	int ch = fgetc(stdin);
	fputc(ch, stdout);
	return 0;                   //你输入什么它就输出什么
}

fgets()与fputs()

char *fgets( char *string, int n, FILE *stream )

fgets()作用是从文件中读取字符串,它的三个参数可以这样理解:第一个参数是dest(目的地),第二个是读取字符的个数,第三个是src(源头)。大致用法如下:

#include <stdio.h>
int main()
{
	char arr[1024] = { 0 };

	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}

	fgets(arr, 1024, pf);
	puts(arr);                 //相当于printf("%s", arr);
	fgets(arr, 1024, pf); 
	puts(arr);

	fclose(pf);
	pf = NULL;
	return 0;
}

操作过程大致如fgetc(),留给读者自行操作检验。

int fputs( const char *string, FILE *stream )

fputs()函数第一个参数想是要输入的字符串,第二个参数是目标文本。大致用法如下:

#include <stdio.h>
int main()
{
	char buf[1024] = { 0 };
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		return 0;
	}
	fputs("hello", pf);
	fputs("zjr", pf);
	return 0;
}

操作过程大致如fputc(),留给读者自行操作检验。

fread()与fwrite()

这两个函数是用于一次读取一组数据,即按数据块读写文件的。

size_t fread( void *buffer, size_t size, size_t count, FILE *stream )

fread()函数第一个参数是待读入数据块的起始地址,第二个参数是size是每个数据块的大小,第三个参数是最多允许读取的数据块的个数,函数返回的是实际读到的数据块个数

size_t int fwrite( const void *buffer, size_t size, size_t count, FILE *stream )

fwrite()函数第一个参数是待输出数据块的起始地址,第二个参数是size是每个数据块的大小,第三个参数是最多允许写入的数据块的个数,函数返回的是实际写入的数据块个数

fseek()与ftell()

这两个函数能实现文件的随机读写,理解难度不大。

int fseek( FILE *stream, long offset, int origin )         offset是长整型位移量

long ftell( FILE *stream )

查询MSDN可知fseek()有三种用法:

SEEK_CUR->光标定位到当前位置

SEEK_END->El cursor se coloca al final de la cadena

SEEK_SET->El cursor se coloca al principio de la cadena    (te explicaré qué es el cursor en un futuro próximo)

Sin más preámbulos, el código de arriba:

#include <stdio.h>
int main()
{
	FILE* pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	fgetc(pf);
	int pos = ftell(pf);
	printf("%d\n", pos);
	fseek(pf, 5, SEEK_SET);      
	pos = ftell(pf);
	printf("%d\n", pos);
	fclose(pf);
	pf = NULL;
	return 0;
}

Los amiguitos que vieron esto sugirieron que vayas y lo experimentes tú mismo. Es muy claro cuando lo operas.

Acerca del mal uso de feof()

En el proceso de lectura de archivos, el valor de retorno de la función feof() no se puede usar directamente para juzgar si el archivo finaliza, pero se usa para juzgar si la lectura falla o si se encuentra el final del archivo cuando finaliza la lectura del archivo. .

1. Si la lectura del archivo de texto ha terminado, determine si el valor devuelto es EOF (fgetc) o NULL (fgets).

por ejemplo: fgetc() determina si es EOF;

·fgets() determina si el valor de retorno es NULL;

2. Juzgar el final de la lectura del archivo binario, juzgar si el valor de retorno es menor que el número real que se va a leer.

por ejemplo: fread() determina si el valor devuelto es menor que el número real que se va a leer.

fin

Gracias a aquellos que pueden leerlo. Lo anterior es mi breve discusión sobre las operaciones con archivos. Algunas funciones no explicadas no se pueden explicar debido a la falta de capacidad en esta etapa. Se lanzará una versión avanzada de las operaciones con archivos en el futuro. Espero que este artículo mío pueda ayudarlo a usted que va a aprender operaciones con archivos o está aprendiendo operaciones con archivos. Si cree que este artículo es útil para comprender las operaciones con archivos, deje sus favoritos y me gusta.

 

Supongo que te gusta

Origin blog.csdn.net/qq_64263760/article/details/121902229
Recomendado
Clasificación