我收到了這個作業,我必須從 file.txt(max size 4096B) 中讀取四次,基本上將它分成 4 個大小相等的字串。我必須填寫這個結構(只需考慮欄位'msg',我認為問題就在那里):
struct message {
long mtype
int nclient;
int pid;
char path[151];
char msg[1025];
};
我使用了 4 個陣列struct message來存盤所有 4 個部分
這是我的閱讀:
struct message msgs[4];
for (int i = 0; i < 4; i ) {
msgs[i].nclient=pos 1;
msgs[i].mtype = 42;
msgs[i].pid = getpid();
strcpy(msgs[i].path, filespath[pos]);
if (read(fd, msgs[i].msg, nMsgSize[i]) == -1)
ErrExit("read failed");
printf("I've read: %s\nMSGSize: %d\nPath: %s\n",msgs[i].msg, nMsgSize[i], msgs[i].path);
}
我在包含以下文本的檔案“sendme_5.txt”上對其進行了測驗:
A B C D
這是我的輸出:
我讀過:A MSGSize:1 路徑:/home/luca/Desktop/system_call_meh/myDir/joe_bastianich/bruno_barbieri/sendme_5.txt
我讀過:BP"?> MSGSize:1 路徑:/home/luca/Desktop/system_call_meh/myDir/joe_bastianich/bruno_barbieri/sendme_5.txt
我讀過:C#??;?U MSGSize:1 路徑:/home/luca/Desktop/system_call_meh/myDir/joe_bastianich/bruno_barbieri/sendme_5.txt
我已閱讀:D?.?>? MSGSize:1 路徑:/home/luca/Desktop/system_call_meh/myDir/joe_bastianich/bruno_barbieri/sendme_5.txt
如果我嘗試讀取完整檔案而不將其分成 4(只有一次讀取),它會正確顯示。
當我更改欄位時,問題就開始了char path[151]。在分配更改后,我們必須將最大大小從 PATH_MAX(4096) 設定為 151,但我不知道它是否相關。
這里有什么問題?
uj5u.com熱心網友回復:
如上所述,read不知道空終止字串是什么。它處理原始位元組,不對它讀取的資料做任何假設。
照原樣,您的字串可能不是以空值結尾的。printf("%s", msgs[i].msg)可能會繼續超過讀取資料的末尾,可能會超過緩沖區的末尾,搜索空終止位元組。除非讀取的資料碰巧包含一個以空值結尾的位元組,或者緩沖區事先被清零(并且沒有被 完全填充read),否則這是未定義的行為。
成功時,read回傳讀入緩沖區的位元組數。這可能少于要求。回傳值的型別為ssize_t。
當使用此系統呼叫填充字串緩沖區時,回傳值可用于索引和放置空終止位元組。應始終為這種情況保留一個額外的位元組(即,始終讀取最多緩沖區的大小減去 1: char buf[256]; read(fd, buf, 255))。
始終檢查錯誤,否則 的回傳值-1將索引緩沖區越界。
假設nMsgSize[i]是msgs[i].msg緩沖區的確切大小:
ssize_t n;
if (-1 == (n = read(fd, msgs[i].msg, nMsgSize[i] - 1)))
ErrExit("read failed");
msgs[i].msg[n] = 0;
printf("READ:%zd/%d expected bytes, MSG:<<%s>>\n", n, nMsgSize[i] - 1, msgs[i].msg);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485118.html
上一篇:程式在C中中途停止執行
