【问题标题】:C++ std::getline size limit on Mac OSXMac OSX 上的 C++ std::getline 大小限制
【发布时间】:2010-10-11 21:05:29
【问题描述】:

我在 Mac OSX Snow Leopard 上遇到 std::getline 问题。出于某种原因,它限制了输入的大小,而在 Debian/Ubuntu 上却是无限大小?

std::getline(std::cin, input)

关于极限的任何线索?

【问题讨论】:

  • 有限制是什么意思?当您尝试超过限制时会发生什么?
  • OS X x64 上的限制 (str.max_size()) 为 4 EB。严重怀疑这是问题所在。您更有可能遇到分隔符或 EOF。
  • 实际输入是什么,你在程序中得到了什么?一段可编译的短代码会很好(您可能会通过编写短代码 sn-p 来解决您自己的问题)。
  • 原因还不清楚,但肯定不是std::getline()的限制。
  • 使用 QT Builder 控制台,我可以输入任意数量的字符。该问题仅在使用 Mac OSX Snow Leopard Terminal 时出现。它限制了您可以输入的字符数量。我还没有想出如何增加它。

标签: c++ max getline


【解决方案1】:

C++ 标准是这样描述getline 函数的:


21.3.7.9 插入器和提取器 [lib.string.io]

template<class charT, class traits, class Allocator>
  basic_istream<charT,traits>&
    getline(basic_istream<charT,traits>& is,
            basic_string<charT,traits,Allocator>& str,
            charT delim);

效果:首先构造一个哨兵对象k,就像basic_istream&lt;charT,traits&gt;::sentry k(is)一样。如果bool(k) 为真,则调用 str.erase() 然后从is 中提取字符并将它们附加到str 就像通过调用 str.append(1,c) 直到发生以下任何一种情况:

  • 文件结束出现在输入序列上(在这种情况下,getline 函数调用 is.setstate(ios_base::eofbit))。
  • c == delim 用于下一个可用输入字符 c(在这种情况下,c 被提取但不附加)(27.4.5.3)
  • 存储str.max_size() 字符(在这种情况下,函数调用is.setstate(ios_base::failbit))(27.4.5.3)

所以,你会得到一个短线的唯一原因是 (a) 你的 C++ 实现不符合标准(极不可能),你到达文件结尾,或者你正在阅读4 GB 线(极不可能)。

【讨论】:

  • Mac OS X 默认构建 64 位,因此 4 GB 不应是 string::max_size() 的限制。
【解决方案2】:

平台 (Windows/Unix/Mac OSX) 之间的区别不是 std::getline。这就是在不同平台上定义行终止符的方式。它是 '\n\r' 用于基于 Windows,'\n' 用于基于 unix 和 ('\r'?) 用于 MacOS 平台。尝试使用 MacOS 编辑器生成文本文件(或测试文件),并检查使用 std::getline 的输入大小是否仍有限制?

【讨论】:

  • 您的一般答案很好,但 Mac 不使用 \r 作为分隔符。他们像任何 Unix 系统一样使用\n。 (在 2001 年之前的极旧版本的 Mac OS 中,您可能会发现使用了 \r。)
  • 在 Windows 系统上,使用\r\n,而不是\n\r。无论如何,如果文件以文本模式打开,则无关紧要:无论平台行尾是什么,行尾都将被规范化为\n
猜你喜欢
  • 2016-12-30
  • 2010-11-10
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2018-06-09
  • 2011-10-12
  • 2018-11-19
相关资源
最近更新 更多