讀取時好像讀取(0,緩衝區,255)總是返回1。在我的程序中,我通過管道直接輸入這個程序,但我注意到它總是返回1.爲什麼是這樣?有沒有更好的方法來做到這一點?同時,它似乎正確地填滿了緩衝區,超過了1個字符。從標準輸入讀取
預先感謝您!
讀取時好像讀取(0,緩衝區,255)總是返回1。在我的程序中,我通過管道直接輸入這個程序,但我注意到它總是返回1.爲什麼是這樣?有沒有更好的方法來做到這一點?同時,它似乎正確地填滿了緩衝區,超過了1個字符。從標準輸入讀取
預先感謝您!
read
被允許返回的字符數少於您要求的字符數,因此您應該爲該可能性編碼,而不是試圖找到避免它的方法。
例如,如果文件(或管道)中只剩下22個字節,它會爲您提供這些字節。
從Linux man page(因爲read
是POSIX的事情,而不是一個C++的東西):
它不是一個錯誤,如果這個數大於所請求的字節的數量少;這可能會發生,例如因爲現在實際上可用的字節更少(可能因爲我們接近文件結束,或者因爲我們正在從管道讀取數據或從終端讀取數據),或者因爲read()被中斷信號。
如果你的緩衝區的其餘部分似乎是正確填充的,我可以向你保證這完全是偶然的,你不應該依賴它。如果read
返回1,那麼只能使用那一個字符。如果你遵循規則和字符似乎消失,然後你可以回來抱怨一個錯誤read
實現(我不應該指出,這是不可思議的)。
試試下面的程序:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
char buff[255];
int i;
while ((i = read (0, buff, 255)) > 0) {
printf ("%3d: [%*.*s]\n", i, i, i, buff);
}
return 0;
}
有:
echo hello there | ./tstprg ; (echo hello ; sleep 1 ; echo there) | ./tstprg
,看看你會得到什麼。我的輸出是:
12: [hello there
]
6: [hello
]
6: [there
]
如我所料。
事情是,我緩衝區的其餘部分正確填充,無論我使用[echo「blalala」|項目],它總是告訴我,我只讀了1個字符,但它正確地填充了其餘部分! grrr – Cenoc 2010-09-10 02:10:34
@Cenoc,你說它_seems_正確填充,但在下一次讀取時會發生什麼?在下一個字符或字符255前進的第一個字符?這可能是讀取從內部緩衝區複製大塊,但仍然只會將內部緩衝區指針前進1.底線,如果讀取爲1,則無論緩衝區中是什麼,這就是您使用的。現在,如果您使用1並因此而啓動_losing_字符,那麼_我們需要進一步調查。 – paxdiablo 2010-09-10 02:18:08
換句話說,如果你輸入「123456789」,並且執行兩次讀取(第一次返回1),第二次讀取是否返回「2」作爲第一個字符或其他東西(包括EOF的返回碼0)? – paxdiablo 2010-09-10 02:35:21
因爲它被標記爲C++,我想這不會是問題,但只是檢查,是否包含''? –
Potatoswatter
2010-09-10 01:47:48
沒有包括在內 – Cenoc 2010-09-10 02:08:39
好吧,在C語言中,如果它沒有提前聲明,它會被認爲返回'int'(而它可能會返回64位),這可能會導致你的問題。沒有理由不這樣做,所以最好的做法是繼續幷包含它。 – Potatoswatter 2010-09-10 02:25:49