2011-03-17 2 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] [enter] f [enter]"라고 타이핑했다.

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

셋째, 나는 각 getc/get() 호출에 대해 "자위대"를 입력했습니다.

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

조회가 라인 버퍼 내에서 작동하는 것으로 보입니다.

다음은 코드입니다.

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

std::cin "seekg()을 지원합니다"그것은 실패하는 경우 : 당신이 당신의 상태가 여기에 반대 한 것처럼

#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

나에게 같은데?

+0

아, 네 말이 맞아. 죄송합니다. – Manuel