2010-09-10 153 views
0

讀取時好像讀取(0,緩衝區,255)總是返回1。在我的程序中,我通過管道直接輸入這個程序,但我注意到它總是返回1.爲什麼是這樣?有沒有更好的方法來做到這一點?同時,它似乎正確地填滿了緩衝區,超過了1個字符。從標準輸入讀取

預先感謝您!

+0

因爲它被標記爲C++,我想這不會是問題,但只是檢查,是否包含''? – Potatoswatter 2010-09-10 01:47:48

+0

沒有包括在內 – Cenoc 2010-09-10 02:08:39

+0

好吧,在C語言中,如果它沒有提前聲明,它會被認爲返回'int'(而它可能會返回64位),這可能會導致你的問題。沒有理由不這樣做,所以最好的做法是繼續幷包含它。 – Potatoswatter 2010-09-10 02:25:49

回答

0

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 
] 

如我所料。

+0

事情是,我緩衝區的其餘部分正確填充,無論我使用[echo「blalala」|項目],它總是告訴我,我只讀了1個字符,但它正確地填充了其餘部分! grrr – Cenoc 2010-09-10 02:10:34

+0

@Cenoc,你說它_seems_正確填充,但在下一次讀取時會發生什麼?在下一個字符或字符255前進的第一個字符?這可能是讀取從內部緩衝區複製大塊,但仍然只會將內部緩衝區指針前進1.底線,如果讀取爲1,則無論緩衝區中是什麼,這就是您使用的。現在,如果您使用1並因此而啓動_losing_字符,那麼_我們需要進一步調查。 – paxdiablo 2010-09-10 02:18:08

+0

換句話說,如果你輸入「123456789」,並且執行兩次讀取(第一次返回1),第二次讀取是否返回「2」作爲第一個字符或其他東西(包括EOF的返回碼0)? – paxdiablo 2010-09-10 02:35:21