2

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

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

关于限制的任何线索?

4

2 回答 2

1

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

于 2010-10-11T21:26:11.910 回答
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,就好像 by 一样basic_istream<charT,traits>::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 的行(不大可能)。

于 2010-10-11T21:27:45.523 回答