Mac OSX 10.8.1 (Mountain Lion)에서 Apple clang 버전 4.1 (tags/Apple/clang-421.11.66)을 사용하고 있습니다 (기반). LLVM 3.1svn) - 최신 제공.clang 및 libC++ istream :: peek()가 eof 플래그를 설정하지 않음
libC++ std :: istream :: peek()이있는 Clang이 eof detection과 관련하여 잘못 작동하는 것 같습니다. libstdC++에는 문제가 나타나지 않습니다.
Test.cpp에 : : "그 소리 ++ -stdlib = 된 libstdC++ Test.cpp에"로 컴파일 된 파일에서
#include <iostream>
#include <sstream>
void printstat(std::istream& data) {
std::cout << "flags: eof: " << data.eof() << "; good: " << data.good() << "; bad: " << data.bad() << " fail: " << data.fail() << std::endl;
}
int main() {
std::stringstream data("a");
printstat(data);
while (data.good()) {
char a = data.get();
std::cout << "get(): " << a << std::endl;
printstat(data);
data.peek();
std::cout << "peek()" << std::endl;
printstat(data);
std::cout << std::endl;
}
return 0;
}
출력 (이 모습
간단한 예는 다음과 표준 라이브러리의 버전에 따라 다른 결과를주고있다) 올바른 : "그 소리 ++ -stdlib = libc의 ++ Test.cpp에"로 컴파일 된 파일에서
flags: eof: 0; good: 1; bad: 0 fail: 0
get(): a
flags: eof: 0; good: 1; bad: 0 fail: 0
peek()
flags: eof: 1; good: 0; bad: 0 fail: 0
출력 (이) 나를 위해 잘못된 같습니다
get(): a
flags: eof: 0; good: 1; bad: 0 fail: 0
peek()
flags: eof: 0; good: 1; bad: 0 fail: 0
get(): ?
flags: eof: 1; good: 0; bad: 0 fail: 1
peek()
flags: eof: 1; good: 0; bad: 0 fail: 1
이 문제의 가장 간단한 해결 방법은 libC++ 대신 libstdC++를 사용하는 것 같습니다. 불행히도 저는 libC++만이 유일한 해결책이기 때문에 몇 가지 C++ 11 기능을 사용할 필요가 있습니다.
libC++와 libstdC++ 사이의 불일치를 eof 비트 동작으로보고하지만 일부는 내 것과 다릅니다.
누구도 내 문제와 동일한 문제가 발생 했습니까? 그것을 해결하는 일반적인 해결책이 있습니까? 더러운 해결 방법이 있다고 상상할 수도 있지만 사용하지 않을 것입니다.
도움을 위해 미리 감사드립니다.