2014-09-19 75 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);