確保read和write資料完整

2021-07-24 17:01:39 字數 1631 閱讀 1094

write函式定義如下:

#include 

ssize_t write(int filedes, void *buf, size_t nbytes);

// 返回:若成功則返回寫入的位元組數,若出錯則返回-1

// filedes:檔案描述符

// buf:待寫入資料快取區

// nbytes:要寫入的位元組數

同樣,為了保證寫入資料的完整性,在《unix網路程式設計 卷1》中,作者將該函式進行了封裝,具體程式如下:

ssize_t                        /* write "n" bytes to a descriptor. */

writen(int fd, const

void *vptr, size_t n)

nleft -= nwritten;

ptr += nwritten;

}return(n);

}/* end writen */

void

writen(int fd, void *ptr, size_t nbytes)

read函式定義如下:

#include 

ssize_t read(int filedes, void *buf, size_t nbytes);

// 返回:若成功則返回讀到的位元組數,若已到檔案末尾則返回0,若出錯則返回-1

// filedes:檔案描述符

// buf:讀取資料快取區

// nbytes:要讀取的位元組數

有幾種情況可使實際讀到的位元組數少於要求讀的位元組數:

1)讀普通檔案時,在讀到要求位元組數之前就已經達到了檔案末端。例如,若在到達檔案末端之前還有30個位元組,而要求讀100個位元組,則read返回30,下一次再呼叫read時,它將返回0(檔案末端)。

2)當從終端裝置讀時,通常一次最多讀一行。

3)當從網路讀時,網路中的快取機構可能造成返回值小於所要求讀的字結束。

4)當從管道或fifo讀時,如若管道包含的位元組少於所需的數量,那麼read將只返回實際可用的位元組數。

5)當從某些面向記錄的裝置(例如磁帶)讀時,一次最多返回乙個記錄。

6)當某乙個訊號造成中斷,而已經讀取了部分資料。

在《unix網路程式設計 卷1》中,作者將該函式進行了封裝,以確保資料讀取的完整,具體程式如下:

ssize_t                        /* read "n" bytes from a descriptor. */

readn(int fd, void *vptr, size_t n)

else

if (nread == 0)

break; /* eof */

nleft -= nread;

ptr += nread;

}return(n - nleft); /* return >= 0 */

}/* end readn */

ssize_t

readn(int fd, void *ptr, size_t nbytes)

參考:

read 函式和 write 函式

read 函式和 write 函式 最近開始從事搜尋引擎的工作,所以又重新開始了c c 的旅程,時隔4年 不得不複習一下c c 其中的內容,以下內容有網上別的朋友發表的,也有我自己總結的.1.read include ssize t read int filedes,void buf,size t ...

read 函式和 write 函式

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

Python中read和write用法

讀操作有read readline和readlines函式 看示例 f open 1.txt r data f.read 讀出所有的內容 print data f.close 結果 i m ok i m fine hello world f open 1.txt r data f.readline ...