IO檔案操作函式read 和write

2021-09-10 19:59:18 字數 2668 閱讀 5763

函式read()和write()、lseek()和close() 的基本使用與試驗,實現檔案的寫入、讀取、移位、關閉

#include#include#include#include#include#include#includeint main()

else

printf("open file :hello.c %d\n",fd);

if((size=write(fd,buf,len))<0)

//成功則顯示成功,失敗則顯示失敗

else

printf("write file: %s\n",buf);

lseek(fd,0,seek_set);

if((size=read(fd,buf_r,len))<0)

//成功則顯示成功,失敗則顯示失敗

else printf("read from the file is :%s\n",buf_r);

if((size=close(fd))<0)

//成功則顯示成功,失敗則顯示失敗

else printf("close the file success\n");

return 0;

}~

1,fread是帶緩衝的,read不帶緩衝.

2,fopen是標準c裡定義的,open是posix中定義的.

3,fread可以讀乙個結構.read在linux/unix中讀二進位制與普通檔案沒有區別.

4,fopen不能指定要建立檔案的許可權.open可以指定許可權.

5,fopen返回指標,open返回檔案描述符(整數).

6,linux/unix中任何裝置都是檔案,都可以用open,read.

如果檔案的大小是8k。

你如果用read/write,且只分配了2k的快取,則要將此檔案讀出需要做4次系統呼叫來實際從磁碟上讀出。

如果你用fread/fwrite,則系統自動分配快取,則讀出此檔案只要一次系統呼叫從磁碟上讀出。

也就是用read/write要讀4次磁碟,而用fread/fwrite則只要讀1次磁碟。效率比read/write要高4倍。

如果程式對記憶體有限制,則用read/write比較好。

都用fread 和fwrite,它自動分配快取,速度會很快,比自己來做要簡單。如果要處理一些特殊的描述符,用read 和write,如套介面,管道之類的

系統呼叫write的效率取決於你buf的大小和你要寫入的總數量,如果buf太小,你進入核心空間的次數大增,效率就低下。而fwrite會替你做快取,減少了實際出現的系統呼叫,所以效率比較高。

如果只呼叫一次(可能嗎?),這倆差不多,嚴格來說write要快一點點(因為實際上fwrite最後還是用了write做真正的寫入檔案系統工作),但是這其中的差別無所謂。

read函式從開啟的裝置或檔案中讀取資料。

#include ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回讀取的位元組數,出錯返回-1並設定errno,如果在調read之前已到達檔案末尾,則這次read返回0
引數count是請求讀取的位元組數,讀上來的資料儲存在緩衝區buf中,同時檔案的當前讀寫位置向後移。注意這個讀寫位置和使用c標準i/o庫時的讀寫位置有可能不同,這個讀寫位置是記在核心中的,而使用c標準i/o庫時的讀寫位置是使用者空間i/o緩衝區中的位置。

fread就是通過read來實現的,fread是c語言的庫,而read是系統呼叫

但是差別在read每次讀的資料是呼叫者要求的大小,比如呼叫要求讀取10個位元組資料,read就會讀10個位元組資料到陣列中,而fread不一樣,為了加快讀的速度,fread每次都會讀比要求更多的資料,然後放到緩衝區中,這樣下次再讀資料只需要到緩衝區中去取就可以了。

fread每次會讀取乙個緩衝區大小的資料,32位下一般是4096個位元組,相當於呼叫了read(fd,buf,4096)

比如需要讀取512個位元組資料,分4次讀取,呼叫read就是:

for(i=0; i<4; ++i)

read(fd,buf,128)

一共有4次系統呼叫

而fread一次就讀取了4096位元組放到緩衝區了,所以省事了

比如用fgetc讀乙個位元組,fgetc有可能從核心中預讀1024個位元組到i/o緩衝區中,再返回第乙個位元組,這時該檔案在核心中記錄的讀寫位置是1024,而在file結構體中記錄的讀寫位置是1。注意返回值型別是ssize_t,表示有符號的size_t,這樣既可以返回正的位元組數、0(表示到達檔案末尾)也可以返回負值-1(表示出錯)。read函式返回時,返回值說明了buf中前多少個位元組是剛讀上來的。有些情況下,實際讀到的位元組數(返回值)會小於請求讀的位元組數count,例如:

C 檔案操作Read函式

1.read 標頭檔案 include unistd.h 函式原型 ssize t read int filedes,void buf,size t nbytes 返回值 讀取到的位元組數 0 讀到 eof 1 出錯 read 函式從 filedes 指定的已開啟檔案中讀取nbytes位元組到 bu...

檔案I O(不帶緩衝)之read函式

呼叫read函式從開啟檔案中讀資料。include ssize t read int filedes,void buf,size t nbytest 返回值 若成功則返回讀到的位元組數,若已讀到檔案結尾則返回0,若出錯則返回 1。有多種情況可是實際讀到的位元組數少於要求讀的位元組數 讀操作從檔案的當...

Linux檔案IO介面之read函式使用

往乙個檔案寫入資料,並讀取資料 include include 呼叫open 函式所需的標頭檔案 include include include write read int main char str 20 open file fd open home chenhai test a.txt o r...