c - 带 fread 和 fwrite 的 I/O

标签 c

下面是我的简单猫问题,它读取一个文件并在终端上打印它。当我将 BUFISZE 宏设置为 10 时,它工作正常。如果我将 BUFSIZE 设置为 100,它会打印文件的一部分。如果我将 BUFIZE 设置为 1024,它什么都不打印。谁能解释一下这是怎么回事?

#include <stdio.h>
#include <string.h>

#define BUFSIZE 10

int main(int argc, char **argv){

      char buf[BUFSIZE];
      FILE *fp;

      if( (fp = fopen(*++argv, "r")) == NULL){
          printf("cannot open %s\n", *argv);
          return 1;
       }

      while( fread(buf, BUFSIZE, 1, fp) == 1 ) 
          if (fwrite(buf,strlen(buf), 1, stdout) != 1 ){
                printf("write error.\n");
                return 2;
           }

     printf("\n");
     return 0;      
  }

最佳答案

不要在这里使用strlen;您在这里不处理以 null 结尾的字符串。您阅读了固定的 block 大小。您应该写入与阅读的相同数量的字符。

fread 返回已成功读取的给定大小的元素数。在调用 fread 时使用此信息。为此,您必须将数据视为 BUFSIZE 字节,而不是一 block BUFSIZE 字节。 (如果这听起来很深奥:交换 freadfwrite 中的第二个和第三个参数。这些函数返回的数字不能大于它们的第三个参数,即元素计数。)

所以:

char buf[BUFSIZE];
size_t n;

do {
    n = fread(buf, 1, BUFSIZE, stdin);
    if (n > 0) fwrite(buf, 1, n, stdout);
} while (n == BUFSIZE);

关于c - 带 fread 和 fwrite 的 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25940957/

相关文章:

c++ - 为什么一般程序一般都是从0x8000开始?

c - 你如何在 C 中读取 scanf 直到 EOF?

c - 线程创建过程中程序执行的流程

c - 用 'zeroes' 填充数组 -memset() 不起作用 -

c - strcmp 表示看似相同的字符串不相等

c - 将 void 指针的值设置为整数

c - 行、选项卡 ,'s' 计数问题和 EOF 错误

c - c中的节点和结构

c - 如何更改c中的数据类型

c - 同一台机器相同的程序不同的cpu时间。为什么?