【发布时间】:2012-04-25 02:59:01
【问题描述】:
我正在尝试编写一个猫克隆来练习 C,我有这个代码:
#include <stdio.h>
#define BLOCK_SIZE 512
int main(int argc, const char *argv[])
{
if (argc == 1) { // copy stdin to stdout
char buffer[BLOCK_SIZE];
while(!feof(stdin)) {
size_t bytes = fread(buffer, BLOCK_SIZE, sizeof(char),stdin);
fwrite(buffer, bytes, sizeof(char),stdout);
}
}
else printf("Not implemented.\n");
return 0;
}
我尝试了echo "1..2..3.." | ./cat 和./cat < garbage.txt,但在终端上看不到任何输出。我在这里做错了什么?
编辑: 根据cmets和answers,我最终这样做了:
void copy_stdin2stdout()
{
char buffer[BLOCK_SIZE];
for(;;) {
size_t bytes = fread(buffer, sizeof(char),BLOCK_SIZE,stdin);
fwrite(buffer, sizeof(char), bytes, stdout);
fflush(stdout);
if (bytes < BLOCK_SIZE)
if (feof(stdin))
break;
}
}
【问题讨论】:
-
不要使用
feof作为你的循环条件;直到 在 您尝试读取文件末尾之后它才会返回 true,因此您的循环可能会经常执行一次。请检查fread的结果,如果它小于 BLOCK_SIZE,则 调用feof以检查文件结尾。并且您需要在fwrite调用之后添加fflush(stdout);。 -
这里 fread() 几乎总是产生零字节,除非您输入的正是 512 个字符。
-
@JohnBode 我的编辑看起来如何?
-
更好,尽管您可能想检查在写入
stdout之前返回的字节数。你可以颠倒测试的意义,比如if (bytes > 0) fwrite(...) else break;;毕竟,如果你得到 0 个字节,你还不如命中了 EOF。