Hay dos conjuntos de funciones en las operaciones de archivos, uno es fopen () y fread () en la biblioteca C , y el otro es el sistema Linux llama open () y read () ...
Aunque todos implementan operaciones de archivo, uno de ellos Todavía hay algunas diferencias entre. Quizás encontremos en Internet: fopen () , fread () … son llamadas del sistema búfer, open () , read () … son llamadas del sistema no búfer. Entonces se almacena en búfer al final, ¿qué significa?
Primero el código:
(1) llamada a la función de biblioteca C
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buf; //建立缓冲区
FILE* source, * backup; //设立FILE结构指针
if ((source = fopen("file.txt", "r")) == NULL) //若以只读形式source.dat成功打开,则fopen()返回FILE指针source
{
printf("Error in opening file.\n");
exit(1);
}
if ((backup = fopen("backup_c.txt", "w")) == NULL) //若以只写形式backup.dat无法打开,则创建文件不成功
{
printf("Error in creating file.\n");
exit(1);
}
int flag=1; //判断是否备份成功
while (fread(&buf, sizeof(buf), 1, source) == 1) //用fread函数读取source的一个buf大小的数据到缓冲区
{
if (fwrite(&buf, sizeof(buf), 1, backup) == 0) //用fwrite函数把一个buf大小的缓冲区数据写入backup
{
//若写入错误,则打印“写入文件错误”
flag=0;
printf("Error in wrinting file.\n");
exit(1);
}
}
if(flag)
printf("备份完成!");
if (ferror(source)) //读取文件source出现错误
{
printf("Error in reading file.\n");
exit(1);
}
if (fclose(source)) //source流的关闭出现错误
{
printf("Error in close file.\n");
exit(1);
}
if (fclose(backup)) //backup流的关闭出现错误
{
printf("Error in close file.\n");
exit(1);
}
return 0;
}
(1) llamada al sistema Linux
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(){
//打开文件
int src = open("file.txt",O_RDONLY);//以只读形式打开test文件,返回一个文件描述符
int dest = open("backup_linux.txt",O_RDWR|O_CREAT,0644);//读写方式打开,644是权限
//读取test内容,写入copy_test
char buf[2];//定义字符缓冲数组,用于存放读取到的文件内容
int read_size,write_size = 0;
while((read_size = read(src,buf,1))!= 0)//返回0说明读取完毕
{
write_size += write(dest,buf,read_size);
}
printf("写入文件内容大小为:%d\n",write_size);
//关闭文件
close(src);
close(dest);
return 0;
}
En las dos piezas de código anteriores, encontramos que en realidad necesitan algo llamado búfer para almacenar temporalmente el contenido del archivo.
C库函数调用.c
char buf; //建立缓冲区
linux系统调用.c
char buf[2];//定义字符缓冲数组,用于存放读取到的文件内容
Sin embargo, este búfer no es el otro búfer. El "búfer" en el "sistema de búfer" y el "sistema sin búfer" es diferente del "búfer" en el código anterior.
El llamado sistema sin búfer significa que la capa de usuario no tiene caché y lee y escribe archivos de disco directamente a través de llamadas al sistema, pero para el kernel, todavía se almacena en caché. El kernel ahora escribe los datos en la memoria búfer del kernel y cuando la memoria búfer se desborda Para las operaciones de E / S reales, el sistema de búfer se refiere al establecimiento de un búfer de flujo a nivel de usuario, las funciones de biblioteca leen y escriben datos en el búfer de flujo y las llamadas al sistema se realizan cuando el búfer de flujo se desborda, es decir, se vuelve a llamar a E / S sin búfer.
La diferencia entre las dos series de funciones:
Cotización: la diferencia entre las funciones
IO con búfer y IO sin búfer,
abrir / leer / escribir y fopen / fread / fwrite