我正在尝试编写一个猫克隆来练习C,我有这个代码:
#include #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
echo "1..2..3.." | ./cat
和./cat < garbage.txt
但我在终端上看不到任何输出。 我在这做错了什么?
编辑:根据评论和答案,我最终这样做:
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; } }
我可以引用一个答案: https : //stackoverflow.com/a/296018/27800
fread(buffer, sizeof(char), block_size, stdin);
您的问题似乎是fread的返回值。 我修改了你的代码来打印出值字节,每次都得到0。 fread的手册页清楚地表明fread的返回值不是字符数。 如果遇到EOF,则返回值可能为零(在这种情况下)。 这是因为你试图读取大小为BLOCK_SIZE的1件事而不是BLOCK_SIZE大小为1的东西。
尝试在fwrite()
之后调用fflush(stdout)
fwrite()
忽略我对fflush
评论; 那不是问题。
在fread
调用中交换块大小和元素大小的顺序。 您想要读取大小为1的BLOCK_SIZE元素( sizeof (char)
按定义为1); 你正在做的是尝试读取1个大小为BLOCK_SIZE的元素,所以除非你输入至少 BLOCK_SIZE个字符,否则fread
将返回0. IOW,你的fread
调用需要是
size_t bytes = fread(buffer, 1, sizeof buffer, stdin);
对fwrite
调用进行类似的更改。
需要了解更多c/c++开发分享从stdin读取写入C中的stdout,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享从stdin读取写入C中的stdout相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980467.html