2012-03-22 53 views
1

出於好奇,是否可以暫時添加應該被解釋爲EOF的字符?例如,在循環中使用read()系統調用,並通過暫時將新行字符註冊爲EOF來使其在'\n'上中止。定義EOF字符

+0

另請參閱:http://www.glue.umd.edu/afs/glue.umd.edu/system/info/olh/Programming/C_Programming_on_Glue/The_Third_C_Program_Character_Data/eof_stdio – 2012-03-22 17:27:19

+0

任何字符,或只是換行符? – 2012-03-22 17:28:37

+0

@CarlNorum在這種情況下換行符,但出於好奇任何任意字符。如果你碰巧知道'\ n'的特殊情況,請告訴。 – foo 2012-03-22 17:31:51

回答

3

不,不可能。如果你想從一個文件描述符中讀取,直到你遇到一個特定的字符,並避免讀取任何東西(例如,爲了不消耗其他進程需要的輸入,例如),唯一的解決方案是執行1個字節的讀取。這很慢,但事實就是這樣。

+0

使用stdio(或C++等價物)緩衝代替 - 保存在系統調用中,您可以檢查下一個字符是您正在尋找的那個字符。您可以將其配置爲從磁盤讀取大量數據。 – 2012-03-22 17:36:07

+0

謝謝,這基本上是我懷疑的。我有這個想法,「我想知道如果..」,並想檢查堆棧溢出社區。 – foo 2012-03-22 17:53:15

+1

@EdHeal:的確,如果你是唯一一個從文件描述符中讀取數據的人,這就是你應該做的事情,但是如果你想與其他進程共享fd,這將無濟於事。例如,如果你想實現類似shell的'read'命令(其中後續輸入保留在fd上以供下一個讀取命令),或者如果你正在實現一個web服務器並且希望它通過在處理標題後請求(例如,POST)到子進程。 – 2012-03-22 18:31:07

3

不容易,但它可能是你可以做一些與fdopen()和一個自定義功能:

int freadtochar(char *buffer, int size, char character, FILE *filePtr) 
{ 
    int index = 0; 
    char c; 
    while (index < size && (c = fgetc(filePtr)) != EOF && c != character) 
    { 
     buffer[index++] = c; 
    } 

    return index; 
} 

int main() 
{ 
    int fd = STDIN_FILENO; 

    FILE *filePtr = fdopen(dup(fd), "r"); 

    char buffer[1024]; 
    int bytesRead = freadtochar(buffer, 1024, '\n', filePtr); 

    // buffer should now contain all characters up to '\n', but note no trailing '\0' is added 
    fclose(filePtr); 
} 

注意,這還是從原來的文件描述符讀取,它只是緩存中的數據爲您服務。

+0

謝謝,我會訴諸這樣的事情。 – foo 2012-03-22 17:55:03

+1

請注意,這仍然將數據從fd中提取出來;它只是爲你緩衝。還要注意''fclose'關閉了原來的fd,所以如果你不想這樣做,你應該'fdopen(dup(fd),「r」);'而不是。 – 2012-03-22 18:32:17

+0

@R ..非常好的一點,我更新了答案。 – 2012-03-22 18:35:51