文件操作中有兩套函數,一套是C庫中的 fopen()、fread()…,還有一套是linux的系統調用 open()、read()…
雖然都是實現文件操作,但它們之間還是有一些不同。或許在網上我們會查到:fopen()、fread()…是緩衝系統的調用,open()、read()…是非緩衝系統的調用。那麼這的 緩衝 到底是什麼意思呢?
先上代碼:
(1)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)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;
}
在上面的兩份代碼中,我們發現其實它們都需要一個稱之爲緩衝區的東西來暫存文件內容,
C庫函數調用.c
char buf; //建立緩衝區
linux系統調用.c
char buf[2];//定義字符緩衝數組,用於存放讀取到的文件內容
但是,此緩衝非彼緩衝,“緩衝系統”、“非緩衝系統”中的“緩衝”與上面代碼中的“緩衝區”,這兩個概念是不同的。
所謂非緩衝系統是指用戶層沒有緩存,通過系統調用直接對磁盤文件進行讀寫,但是對於內核來說,還是進行了緩存,內核現將數據寫到內核緩衝存儲器中,當緩衝存儲器溢出時再進行實際的IO操作,緩衝系統是指在用戶層建立一個流緩存區,庫函數向流緩存區讀寫數據,流緩存區溢出時進行系統調用,即再調用無緩衝的IO。
兩個系列函數的區別:
引用資料:
帶緩衝的IO和不帶緩衝的IO
open/read/write和fopen/fread/fwrite函數的區別