gpt4 book ai didi

macos - clang 和 libc++ istream::peek() 不设置 eof 标志

转载 作者:行者123 更新时间:2023-12-04 23:52:13 24 4
gpt4 key购买 nike

我正在使用 Mac OSX 10.8.1 (Mountain Lion):Apple clang 4.1 版 (tags/Apple/clang-421.11.66)(基于 LLVM 3.1svn)- 最新版本。

使用 libc++ std::istream::peek() 的 Clang 似乎在 eof 检测方面工作不正确。 libstdc++ 不会出现问题。

下面的简单示例根据标准库版本给出不同的结果:

测试.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;
}

使用“clang++ -stdlib=libstdc++ 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

使用“clang++ -stdlib=libc++ test.cpp”编译的文件的输出(这对我来说看起来不正确):

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

此问题的最简单解决方法似乎是使用 libstdc++ 而不是 libc++。不幸的是,我需要使用一些 c++11 功能,所以 libc++ 是唯一的解决方案。

我在那里发现了一些帖子,它们报告了 libc++ 和 libstdc++ 在 eof 位行为方面的差异,但与我的不同。

有没有人遇到和我一样的问题。有什么通用的解决方案可以解决吗?我可以想象一些肮脏的解决方法,但我宁愿不使用它。

提前感谢您的帮助

最佳答案

我很抱歉。这是 libc++ 中的错误。它已在 libc++ svn 公共(public)主干中得到修复,但修复需要重新编译的 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);

正如您已经推测的那样,解决方法是不依赖于 peek 后的准确 eof 检查。

关于macos - clang 和 libc++ istream::peek() 不设置 eof 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com