我找到了一个接收标准输入的程序
int main(int argc, char **argv) {
if (argc != 2) {
fprintf(stderr, "Usage: %s <PATTERN>\n", argv[0]);
return 2;
}
/* we're not going to worry about long lines */
char buf[4096]; // 4kibi
while (!feof(stdin) && !ferror(stdin)) { // when given a file through input redirection, file becomes stdin
if (!fgets(buf, sizeof(buf), stdin)) { // puts reads sizeof(buf) characters from stdin and puts it into buf; fgets() stops reading when the newline is read
break;
}
if (rgrep_matches(buf, argv[1])) {
fputs(buf, stdout); // writes the string into stdout
fflush(stdout);
}
}
if (ferror(stdin)) {
perror(argv[0]); // interprets error
return 1;
}
return 0;
}为什么buf设置为4096个元素?是因为每行的最大字符数只能是4096个吗?
发布于 2014-02-27 06:00:26
答案在您粘贴的代码中:
/* we're not going to worry about long lines */
char buf[4096]; // 4kibi超过4096个字符的行可以出现,但作者认为它们不值得关注。
还请注意fgets的定义
fget()从流中读取最多小于大小字符的一个字符,并将它们存储到由s指向的缓冲区中。读取在EOF或换行符之后停止。如果读取换行符,则将其存储到缓冲区中。终止空字节(
\0)存储在缓冲区中的最后一个字符之后。
因此,如果一行大于4095个字符(因为4096'th是为空字节保留的),那么它将被拆分到while循环的多个迭代中。
发布于 2014-02-27 06:00:01
该程序每次迭代只读取4096个字符。
行的大小没有限制,但堆栈的大小可能有限制(在现代linux系统中为8MB)。
大多数程序员选择最适合正在实现的程序,在这种情况下,程序员评论说没有必要担心更长的代码行。
发布于 2014-02-27 06:05:38
作者似乎只是有一个非常大的内存块,为他的预期输入,以避免处理块。
这个看似尴尬的数字4096最有可能的解释是:它是a)两个数的幂,b)是内存页大小。因此,当系统选择将一个页面交换到磁盘时,它可以一次完成,而不涉及任何开销。
这是否真的有帮助,这是另一个问题,因为如果您分配一个页面'malloc',它可能不会对齐页面边界。
我自己也经常使用这样的数字,因为它不疼,在最好的情况下,它可能会有所帮助。然而,只有当你担心速度和你对分配过程的完全控制的时候,它才是真正相关的。如果您直接从操作系统分配页面,那么这样的大小可能确实有一些好处。
https://stackoverflow.com/questions/22060177
复制相似问题