帶緩衝的IO和不帶緩衝的IO

  文件操作中有兩套函數,一套是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函數的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章