2013-01-03 4 views
3

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 비트 동작으로보고하지만 일부는 내 것과 다릅니다.

누구도 내 문제와 동일한 문제가 발생 했습니까? 그것을 해결하는 일반적인 해결책이 있습니까? 더러운 해결 방법이 있다고 상상할 수도 있지만 사용하지 않을 것입니다.

도움을 위해 미리 감사드립니다.

답변

1

사과드립니다. 이것은 libC++의 버그입니다. libC++ svn 공용 트렁크에서 수정되었지만,이 수정 사항에는 재 컴파일 된 libC++. dylib가 필요합니다. 이는 OS X 10.8.y에는 존재하지 않습니다.

LLVM의 SVN 서버가 순간에 다운하지만 수정은 단순히 basic_istream<_CharT, _Traits>::peek()에 EOF를 확인하는 것이었다 생각 : 당신이 이미 추측대로,

+   if (traits_type::eq_int_type(__r, traits_type::eof())) 
+    this->setstate(ios_base::eofbit); 

해결 방법은 정확한에 의존하지 않는 것입니다 eof check in peek.