如何使控制台应用程序接收100,000个整数的输入

时间:2012-06-07 21:18:30

标签: c input io cmd

我有一个简单的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]);

测试的打印屏幕: enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用100K整数创建一个文件,然后将其传送到您的应用程序。例如:

cat myInput.txt | myApp

或者在Windows中:

type myInput.txt | myApp

答案 1 :(得分: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 。第一个读取将获得前八个字节,第二个读取将获得接下来的两个字节,您将不得不构建您的数字。