c/c++语言开发共享从stdin读取写入C中的stdout

我正在尝试编写一个猫克隆来练习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

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月14日

      精彩推荐