read、write函數

3.7 read函數
用r e a d函數從打開文件中讀數據。
#include <unistd.h>
ssize_t read(intf i l e d e s, void *b u f f, size_tn b y t e s) ;
返回:讀到的字節數,若已到文件尾爲0,若出錯爲- 1
如r e a d成功,則返回讀到的字節數。如已到達文件的尾端,則返回0。
有多種情況可使實際讀到的字節數少於要求讀字節數:
• 讀普通文件時,在讀到要求字節數之前已到達了文件尾端。例如,若在到達文件尾端之前還有3 0個字節,而要求讀1 0 0個字節,則r e a d返回3 0,下一次再調用r e a d時,它將返回0 (文件尾端)。
• 當從終端設備讀時,通常一次最多讀一行(第11章將介紹如何改變這一點)。
• 當從網絡讀時,網絡中的緩衝機構可能造成返回值小於所要求讀的字節數。
• 某些面向記錄的設備,例如磁帶,一次最多返回一個記錄。
讀操作從文件的當前位移量處開始,在成功返回之前,該位移量增加實際讀得的字節數。
P O S I X . 1在幾個方面對此函數的原型作了更改。其經典定義是:
int read(intf i l e d e s, char *b u f f, unsignedn b y t e s) ;
首先,爲了與ANSI C一致,其第二個參數由char *改爲void *。在ANSI C中,類型void *用於表示類屬指針。其次,其返回值必須是一個帶符號整數( s s i z e t),以返回正字節數、0(表示文件尾端)或- 1(出錯)。最後,第三個參數在歷史上是一個不帶符號整數,以允許一個1 6位的實現可以一次讀或寫至6 5 5 3 4個字節。在1990 POSIX.1標準中,引進了新的基本系統數據類型ssize_t 以提供帶符號的返回值, s i z e t則被用於第三個參數(見表2 - 7中的S S I Z E M A X常數)。


3.8 write函數
用w r i t e函數向打開文件寫數據。
#include <unistd.h>
ssize_t write(inft i l e d e s, const void b* u f f, size_tn b y t e s) ;
返回:若成功爲已寫的字節數,若出錯爲- 1
其返回值通常與參數n b y t e s的值不同,否則表示出錯。w r i t e出錯的一個常見原因是:磁盤已寫滿,或者超過了對一個給定進程的文件長度限制(見7 . 11節及習題1 0 . 11 )。對於普通文件,寫操作從文件的當前位移量處開始。如果在打開該文件時,指定了O A P P E N D選擇項,則在每次寫操作之前,將文件位移量設置在文件的當前結尾處。在一次成功寫之後,該文件位移量增加實際寫的字節數。

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