【问题标题】:How to make a console application receive an input of 100,000 integers如何让控制台应用程序接收 100,000 个整数的输入
【发布时间】:2012-06-07 21:18:29
【问题描述】:

我有一个简单的 C 控制台应用程序,我正在尝试使用 100,000 的输入对其进行测试。但该程序每次只接收大约 4,096 个字符。这是一个简单的输入示例:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1    //Up to 100,000

如果我每次手动输入一个数字,它就可以工作,但我只想将输入(100,000 个空格分隔的数字)粘贴到控制台中。

PS:对不起,我的英语不太好

编辑:是的,我使用的平台是 Windows cmd。而且我已经尝试过“属性>选项>缓冲区大小”。

代码示例:

int a[100000],i;
for(i=0;i<100000;i++)
    scanf("%i",&a[i]);

测试的打印屏幕:

【问题讨论】:

  • 听起来像缓冲。但是您需要发布更多上下文。例如我认为的代码
  • 您的控制台是什么平台?窗口命令? linux外壳?
  • 您是否尝试使用 fread()fgets()fscanf() 之类的东西来获取输入?完全在一个read() 操作系统级调用中发生重要吗?
  • 您的读取循环有问题。向我们展示您的代码。
  • int a[100000]能保证栈吗?

标签: c input io cmd


【解决方案1】:

标准 IO 例程(例如 printf()scanf())使用 buffering 来提高性能并提供一些很好的标准化例程(例如 fgets() 一次读取一行)。进行函数调用通常比进行系统调用要快得多;如果您要编写一个使用系统调用一次读取一个字节数据的应用程序,那么它的运行速度会比一次读取 1024 个字节或更大的应用程序慢得多。

这几乎总是一件美妙的事情。

但这确实意味着您需要仔细编写应用程序。您不能简单地发出一个read() 风格的函数来一次读取所有数据。 (可用数据量也可能远大于机器上可用的内存和交换空间量,因此即使可以,也不是在所有用例中都非常可靠。)

处理输入流的应用程序往往有类似这样的循环:

int c;
while ((c = getc()) != EOF) {
    /* handle the character c */
}

char buffer[1024];
while (fgets(buffer, sizeof buffer, F)) {
    /* handle buffer */
}

第一种情况很方便,因为您永远不必担心跨两个或更多“缓冲区”的输入 - 但第一种情况确实意味着 sscanf() 和类似工具无法帮助您解析数字。第二种情况确实允许您在解析时使用sscanf(),但您必须准备好输入跨越两个缓冲区。如果缓冲区只有 8 个字节:buffer[8],并且您希望读取 32 字节的 MD5sum 或需要超过 8 个字符来表示的double,则这更容易发现:1234567890。第一次读取将获得前八个字节,第二次读取将获得接下来的两个字节,您必须构造您的数字。

【讨论】:

  • 这是一个不错的选择,但我只想用scanf("%i",&amp;temp) 读取输入100,000 次
  • 人力资源部。当我在我的 Linux 机器上尝试你的小 sn-p 代码时,它运行完成就好了。也许int a[100000] 正在破坏程序可用的堆栈——尝试int *a = malloc(100000 * sizeof int); 动态分配内存。
  • 对不起,我解释的不是很好。问题不在我的 c 代码上。当我尝试在同一行中写入 100,000 个数字(1 1 1 1...)的输入时
  • 因此,如果所有 100,000 个数字都由换行符分隔,则您的代码可以正常工作,但如果它们都在由空格分隔的一行上,您的代码会死吗?
  • 是的,完全正确。所以手动编写 100,000 个数字很不方便,而(如果可能的话)我可以直接粘贴整个输入
【解决方案2】:

您可以创建一个包含 100K 整数的文件,然后将其通过管道传输到您的应用程序。例如:

cat myInput.txt | myApp

或者在 Windows 中:

type myInput.txt | myApp

【讨论】:

  • 我试过这种方式,但是 cmd 返回“进程试图写入不存在的管道”。我做错了什么?
  • @egrunin 现在它什么都不返回,既不返回错误也不返回程序结果
猜你喜欢
  • 2012-10-23
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多