Lectura y escritura de archivos en lenguaje C, por byte, por línea + al leer y escribir archivos, la última línea se lee dos veces.

Flujo de texto

  Flujo de texto, es decir, solemos decir que leemos archivos en modo texto. Algunas características del flujo de texto pueden ser diferentes en diferentes sistemas. Uno de ellos es la longitud máxima de la línea de texto. El estándar estipula que se permiten al menos 254 caracteres. Otra característica que puede ser diferente es cómo termina la línea de texto. Por ejemplo, en el sistema Windows, se acuerda que los archivos de texto terminen con un retorno de carro y un salto de línea. Pero en Linux, solo se usa un final de nueva línea.

   El estándar C coloca el texto como cero o más caracteres, seguido de un carácter de nueva línea (\ n) que indica el final. Para aquellos sistemas donde la representación externa de la línea de texto es diferente de esta definición, la función de biblioteca es responsable de la formularios internos Traducción entre formularios, por ejemplo, en el sistema Windows, cuando se imprime, el carácter de nueva línea del texto se escribe como un par de retorno de carro / avance de línea. Al escribir, se descartan los retornos de carro en el texto. Esta capacidad de manipular texto sin considerar su forma externa simplifica la creación de programas portátiles.

Flujo binario

  Los bytes de la secuencia binaria se escribirán en el archivo completamente de acuerdo con la forma en que está escrito el programa, y ​​se leerán en el programa completamente de acuerdo con la forma en que se leen desde el archivo o dispositivo, sin ningún cambio. Este tipo de flujo es adecuado para datos que no son de texto, pero si no desea que la función de E / S modifique los caracteres de fin de línea del archivo de texto, también puede usarlos para el archivo de texto.

   El lenguaje C no distingue entre estos dos tipos de archivos. Se tratan como flujos de caracteres y se procesan mediante bytes.

   Los archivos abiertos en modo texto y modo binario que solemos ver en nuestros programas solo se reflejan en el procesamiento de saltos de línea.

   Por ejemplo, en Windows, el carácter de nueva línea de un archivo es \ r \ n, pero en Linux es \ n

   Cuando el archivo se abre en modo texto, el carácter de nueva línea \ r \ n en el archivo de lectura-escritura de Windows se reemplazará con \ n y se leerá en la memoria. Cuando el archivo se escribe en Windows, \ n se reemplaza con \ r \ nEscribe el archivo de nuevo. Si el archivo se abre en modo binario, no se realiza la conversión entre \ r \ ny \ n. Dado que el carácter de nueva línea en Linux es \ n, no hay diferencia entre un archivo de texto y un archivo binario.

Funciones de lectura y escritura de archivos

1. Leer y escribir archivos según los caracteres: fgetc (), fputc ()

2. Leer y escribir archivos por línea: fputs (), fgets ()

3. Leer y escribir archivos en bloques: fread (), fwrite ()

4. Leer y escribir archivos de acuerdo con el formato: fprintf (), fscanf ()

5. Leer y escribir archivos según posiciones aleatorias: fseek (), ftell (), rewind ()

Leer y escribir archivos por carácter

#include<stdio.h>
#include<string.h>
#pragma pack(show)



void test01()
{
	int i;
	char ch;
	char buff[] = "hello world";
	FILE* f_read;
	//写文件
	FILE* f_write = fopen("./test1.txt","w");


	if(f_write == NULL)
		return;

	
	for(i = 0;i < strlen(buff);i++)
	{
		fputc(buff[i],f_write);
	}
	fclose(f_write);

	//读文件
	//FILE* f_read = fopen("./test1.txt","r");
	f_read = fopen("./test1.txt","r");
	if(f_read == NULL)
		return;
	while((ch = fgetc(f_read)) != EOF)
	{
		printf("%c",ch);
	}
	fclose(f_read);
}


int main()
{
	test01();

	return 0;
}

resultado de la operación:

Hola Mundo

Al mismo tiempo, aparecerá un archivo test1.txt en el mismo directorio de nivel que el archivo .c

Leer y escribir archivos por línea

#include<stdio.h>
#include<string.h>
#pragma pack(show)



void test01()
{
	int i;
	char ch;
	char temp[1024] = {0};
	
	FILE* f_read;
	//写文件
	FILE* f_write = fopen("./test2.txt","w+");
	char* buff[]=
	{
		"锄禾日当午\n",
		"汗滴禾下土\n",
		"谁知盘中餐\n",
		"粒粒皆辛苦\n"
	};

	if(f_write == NULL)
		return;

	
	for(i = 0;i < 4;i++)
	{
		fputs(buff[i],f_write);
	}
	fclose(f_write);

	//读文件
	//FILE* f_read = fopen("./test1.txt","r");
	f_read = fopen("./test2.txt","r");
	if(f_read == NULL)
		return;

	
	while(!feof(f_read))
	{
	
		fgets(temp,1024,f_read);
		printf("%s",temp);
	}
	fclose(f_read);
}


int main()
{
	test01();

	return 0;
}

resultado de la operación:

El día de la limpieza, el
sudor gotea en el suelo.
Quién sabe que la comida china en el
plato es
un
trabajo duro . Por favor, presione cualquier tecla para continuar ...

Descubrí que la última línea se leyó dos veces, ¿qué pasó?

 

Puede ver las siguientes definiciones en stdio.h :

1

2

3

4

5

6

7

8

9

#define EOF (-1)

#define _IOEOF 0x0010

#define feof(_stream) ((_stream)->_flag & _IOEOF)

int c;

while(!feof(fp))

{

    c = fgetc(fp);

    printf("%X\n", c);

}

La razón es que después de leer el último carácter, fp-> flag todavía no se establece en _IOEOF, por lo que feof () aún no detecta el final del archivo. Hasta que se vuelva a llamar a fgetc () para realizar la operación de lectura, feof () no puede detectar el final del archivo.

Citado de: https://baike.baidu.com/item/feof/10942186?fr=aladdin

Entonces la mejora es la siguiente:

fgets (temp, 1024, f_read);
    while (! feof (f_read))
    {         printf ("% s", temp);         fgets (temp, 1024, f_read);     }


        

 

Supongo que te gusta

Origin blog.csdn.net/weixin_42596333/article/details/104521765
Recomendado
Clasificación