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;
}
아, 네 말이 맞아. 죄송합니다. – Manuel