无法将长 cin 输入读入字符串
Posted
技术标签:
【中文标题】无法将长 cin 输入读入字符串【英文标题】:Can't read in a long cin input to a string 【发布时间】:2017-02-24 16:54:29 【问题描述】:我的代码看起来像这样
string inputString;
std::getline (std::cin, inputString)
cout << inputString;
当我输入一个长字符串 ~30k 个字符时,inputString 只有该字符串的一部分。任何想法如何解决这个问题?
【问题讨论】:
您确定它不包含完整的输入吗?如果你输出inputString.size()
,你会得到什么?
大小是否会受到终端最大允许行长的限制?
您能否添加导致此问题的示例输入及其生成的输出?它可能有助于确定问题。
一定要再次尝试 std::getline() ......看看文本的其余部分是否被第二次读取......
inputString.size() = 4905,远低于全文。我又做了一个getline,它没有自动获取新文本。我尝试了不同的文本,但由于某种原因仍然上限为 4905。
【参考方案1】:
来自std::getline()
cppreference.com 上的文档:
getline
从输入流中读取字符并将它们放入字符串中:1。表现为
UnformattedInputFunction
,但input.gcount()
不受影响。构建并检查哨兵对象后,执行以下操作:
致电
str.erase()
从
input
中提取字符并将它们附加到str
,直到出现以下情况之一(按列出的顺序检查)一个。
input
上的文件结束条件,在这种情况下,getline
设置eofbit
。b.下一个可用的输入字符是
delim
,由Traits::eq(c, delim)
测试,在这种情况下,分隔符是从input
中提取的,但不会附加到str
。c。
str.max_size()
字符已存储,在这种情况下,getline
设置failbit
并返回。如果由于某种原因没有提取字符(甚至没有被丢弃的分隔符),
getline
设置failbit
并返回。2。与
getline(input, str, input.widen('\n'))
相同,即默认分隔符为结束符。
因此请检查您的输入是否受到inputString.max_size()
值的限制。您的系统上可能接近 32k。
【讨论】:
如果 Turbo C++ 可能是 16k :D 嗯,不,max_size() 是 4294967295 的巨大尺寸【参考方案2】:默认情况下,终端工作在规范模式,它有一个长度为 4096 字节的缓冲区。所以这就是字符串可以接受的最大输入是 4095 的原因。现在解决方案是在 Linux 中更改为非规范模式。你可以这样做
$ stty -icanon # for switching to the noncanonical mode.
$ stty icanon # reverting back to the canonical mode when you are done.
【讨论】:
以上是关于无法将长 cin 输入读入字符串的主要内容,如果未能解决你的问题,请参考以下文章