带有fread和fwrite的I / O.

时间:2014-09-19 19:19:35

标签: 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;      
  }

1 个答案:

答案 0 :(得分:2)

此处不要使用strlen;你不是在这里处理以null结尾的字符串。你读固定块。你应该写下你读过的相同数量的字符。

fread返回已成功读取的给定大小的元素数。在致电fread时使用此信息。为此,您必须将数据视为BUFSIZE个字节,而不是一个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);