【问题标题】:visual studio c++ cin big string from command line来自命令行的 Visual Studio C++ cin 大字符串
【发布时间】:2014-06-08 14:08:17
【问题描述】:

当我运行以下程序并将 50000 个符号粘贴到命令行时,程序仅获得 4096 个符号。您能否建议我如何获取完整的符号列表?

#include <iostream>
#include <string>

using namespace std;

int main()
{
    char temp[50001];
    while (cin.getline(temp, 50001, '\n'))
    {
        string s(temp);
        cout << s.size() << endl;
    }
    return 0;
}

附: 当我使用 fstream 从文件中读取符号时,没关系

【问题讨论】:

  • 这是命令行限制
  • 您确定输入中没有分隔符吗?否则可能是平台限制
  • 我不明白,为什么不直接读入std::string
  • 直接读入 std:string 或发布在这里的问题是一样的。如果您成功读取所有符号,请分享代码。
  • 您的文件是否包含 EOF 字符?例如,在 Windows 平台上,Crtl-Z 字符表示文件结束。要验证这一点,请使用std::cin.get 方法输入文本。使用std::cin.gcount 获取实际读取的字符数。

标签: c++ visual-studio-2010 cin getline


【解决方案1】:

我在这里进行了一次跳跃,但由于许多 powershell 终端有 4096 个截断限制(请查看Out-File 文档),这可能是 Windows 命令行限制而不是 getline 限制。

其他人之前也遇到过同样的问题:https://github.com/Discordia/large-std-input/blob/master/LargeStdInput/Main.cpp

【讨论】:

  • 谢谢。难道我们不能改变VS的设置来解决这个问题吗?
  • 这不是 VS 限制 AFAIK,而是控制台限制。而且由于这是设计使然,他们通常建议解决该问题(正如其他帖子所建议的那样)
【解决方案2】:

我不明白您为什么要读取字符数组,然后将其转换为字符串。

无论如何,您的问题可能与重复分配有关。

直接读入 std::string
简单的两行:

std::string s;
getline(cin, s, '\n');

先读入数组
是的,还有一个更简单的方法:

    #define BUFFER_SIZE 8196  // Very important, named constant
    char temp[BUFFER_SIZE];
    cin.getline(temp, BUFFER_SIZE, '\n');

//  Get the number of characters actually read
    unsigned int chars_read = cin.gcount();

    std::string s(temp, chars_read);  // Here's how to transfer the characters.

使用调试器,您需要查看chars_read 中的值,以验证读取的字符数量是否有效。

二进制读取
一些平台提供读取的数据和您的程序之间的转换。例如,Windows 使用 Ctrl-Z 作为 EOF 字符; Linux 使用 Ctrl-D。

输入数据可能使用 UTF 编码并包含超出 ASCII 可打印集范围的值。

因此,首选方法是从以binary 模式打开的流中读取。不幸的是,cin 无法以二进制模式轻松打开。
Open cin in binary

如果可能的话,首选方法是将文本放入文件中并从文件中读取。

【讨论】:

  • 感谢您的回答。您描述了两种众所周知的将数据读入 std::string 的方法。当前帖子与读取超过4096的大量符号有关。请尝试调试您的两种方法,您会看到如果您将50000个字符长度的字符串粘贴到命令行中,则只会存储4095 s,temp。
  • 建议使用#define 来创建一个“常量”是令人厌恶的。使用常量而不是宏有什么问题?
  • 抱歉,这是一种语言兼容技术。 C 语言不允许将常量整数变量用作数组容量。我习惯于编写同时编译为 C 和 C++ 的代码。
猜你喜欢
  • 2022-11-20
  • 2021-01-20
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多