我有一个简单的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]);
测试的打印屏幕:
答案 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
。第一个读取将获得前八个字节,第二个读取将获得接下来的两个字节,您将不得不构建您的数字。