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

标签 macos clang eof libc++ peek

我正在使用 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/

相关文章:

ruby - 通过 ruby​​ 和多核支持运行应用程序? (苹果系统)

bash - 检查文件夹是否包含 glob

clang - 与 GCC 相比,编译时间显着变慢

c - windows下EOF的值

windows - 有没有办法为 Mac/Windows 制作双重可执行文件?

java - MacOS 多线程问题?

memory-management - 为什么 clang 的 `-O3` alloca 比 g++ 快 2 倍

c++ - 跨函数禁用 clang 警告

C# 网络流 getString 方法

java - 读取 EOF 后使用 Scanner 类读取 Standard.In 时出现 NoSuchElementException