2014-09-19 76 views
0

下面是我的简单猫问题,它读取一个文件并在终端上打印它。当我将BUFISZE宏设置为10时,它工作正常。如果我将BUFSIZE设置为100,则会打印文件的一部分。如果我将BUFIZE设置为1024,则不会打印任何内容。你能解释一下发生了什么吗?fread和fwrite的I/O

#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;  
    } 
+2

你的文件是少超过1024字节,所以'fread'告诉你它无法读取这个尺寸的对象。我会交换'size'和'count'参数,并且总是读'size'的'count'字节。 – 2014-09-19 19:23:02

+0

'strlen(buf)'不会达到你期望的。注销它返回的内容。 – alk 2014-09-19 19:32:15

+0

如果你正在模拟猫,你可能会处理人类可读的文件。 fgets(3)'是比fread更好的选择。 – HuStmpHrrr 2014-09-19 20:00:47

回答

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);