1

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

测试打印画面: 在此处输入图像描述

4

2 回答 2

1

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

cat myInput.txt | myApp

或在 Windows 中:

type myInput.txt | myApp
于 2012-06-07T21:20:41.303 回答
1

标准 IO 例程(例如printf()scanf())使用缓冲来提高性能并提供一些很好的标准化例程(例如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 或double需要超过 8 个字符来表示的 a 1234567890:。第一次读取将获得前八个字节,第二次读取将获得接下来的两个字节,您必须构造您的数字。

于 2012-06-07T21:46:22.213 回答