2011-03-17 48 views
0

編輯:我在代碼中有一個愚蠢的錯誤,並解決了這個問題,所以現在事情是可以解釋的。我相應地更新了我的帖子。檢查stdin/std :: cin是否支持尋求

以下代碼顯示在行緩衝區內尋找工作。

首先,結果當管道東西進入程序。

$ echo 'asdf' | ./seektest 
stdin does not support fseek() 
c == s 
std::cin does not support seekg() 
Second read to std::cin failed! 
c == ? 
Second read to std::cin failed! 
c == ? 

其次,我輸入「a [enter] s [enter] d [enter] f [enter]」。

$ ./seektest 
a 
stdin supports fseek(). 
s 
c == s 
std::cin supports seekg(). 
d 
c == d 
c == 

第三,我打字 「ASDF」 每個getc/get()通話。

$ ./seektest 
asdf 
stdin supports fseek(). 
asdf 
c == a 
std::cin supports seekg(). 
asdf 
c == a 
c == s 

尋求似乎在行緩衝區內工作。

這是代碼。

#include <iostream> 
#include <cstdio> 

int main(int argc, char ** argv) 
{ 
    // Try cstdio. 
    int x = fgetc(stdin); 
    if (x < 0) { 
     fprintf(stderr, "First read to stdin failed!."); 
    } 
    int res = fseek(stdin, -1, SEEK_CUR); 
    if (!res) { 
     fprintf(stdout, "stdin supports fseek().\n"); 
    } else { 
     fprintf(stdout, "stdin does not support fseek()\n"); 
    } 
    x = fgetc(stdin); 
    if (x < 0) { 
     fprintf(stderr, "Second read to stdin failed!\n"); 
    } 
    char c = x; 
    fprintf(stdout, "c == %c\n", c); 

    // Try iostream. 
    x = std::cin.get(); 
    if (std::cin.fail()) { 
     fprintf(stderr, "First read to std::cin failed!\n"); 
    } 
    std::cin.seekg(-1, std::ios::cur); 
    if (std::cin.fail()) { 
     fprintf(stdout, "std::cin does not support seekg()\n"); 
    } else { 
     fprintf(stdout, "std::cin supports seekg().\n"); 
    } 
    c = std::cin.get(); 
    if (std::cin.fail()) { 
     fprintf(stderr, "Second read to std::cin failed!\n"); 
    } 
    fprintf(stdout, "c == %c\n", c); 
    c = std::cin.get(); 
    if (std::cin.fail()) { 
     fprintf(stderr, "Second read to std::cin failed!\n"); 
    } 
    fprintf(stdout, "c == %c\n", c); 

    return 0; 
} 

回答

1

看起來像你對我有你的情況在這裏逆轉:

if (std::cin.fail()) { 
    fprintf(stdout, "std::cin supports seekg().\n"); 
} else { 
    fprintf(stdout, "std::cin does not support seekg().\n"); 
} 

std::cin 「支持seekg()」 如果失敗

+0

哎呀,你是對的。抱歉。 – Manuel 2011-03-17 08:39:21