2011-09-30 64 views
0
#include <stdio.h> 

int main() { 

    FILE *fp; 
    char ch; 
    char data[100]; 
    int i; 

    fp = fopen("file.txt","r"); 

    i=0; 

    while((ch=fgetc(fp)) != EOF) { 
      data[i]=ch; 
      i++; 
    } 

    i=0; 

    while(data[i]) { 
      printf("%c",data[i]); 
      i++; 
    } 

return 0; 

} 

內容file.txt的的:文件處理:在輸出額外的字符

[email protected] /opt/lampp/htdocs $ cat file.txt 
aGVsbG9teW5hbWVpc2toYW4K 

程序的輸出:

[email protected] /opt/lampp/htdocs $ sudo vim test.c 
[email protected] /opt/lampp/htdocs $ sudo gcc test.c 
[email protected] /opt/lampp/htdocs $ ./a.out 
aGVsbG9teW5hbWVpc2toYW4K 
P�[email protected] /opt/lampp/htdocs $ 

爲什麼出現在陣列的輸出這兩個額外的字符.. ??? 輸入文件實際上是base-64編碼的結果。

+1

'ch'應聲明'int'。作爲'char',它的實現使用'unsigned char',與'EOF'的比較永遠不會是真的。 – pmg

回答

1

fgetc返回int不是char

看看這個作品出來你:

#include <stdio.h> 

int main (void) { 

    FILE *fp; 
    int ch; 
    int data[100] = { 0 }; // Easiest way of initializing the entire array to 0 
    int i; 

    fp = fopen("file.txt","r"); 

    i=0; 

    while((ch=fgetc(fp)) != EOF) { 
      data[i]=ch; 
      i++; 
    } 

//  data[i]=0; -->You did not provide a terminating point - 
// Not needed if the array is initialized the way i did. 

    i=0; 

    while(data[i]) { 
      printf("%c",data[i]); 
      i++; } 
return 0; 

} 
+0

thanx它幫助.. –

1

您不是終止數據[]數組 - 在輸入的末尾沒有任何內容可以設置爲零,因此當您寫出數據時,您會在數據的末尾繼續輸出額外(隨機)值直到你碰巧打到零,

記住在C

1

數據沒有被初始化到任何東西它看起來像它,因爲你沒有設置數據爲零你開始之前。嘗試添加

memset(data,0,sizeof(data)); 

你讀之前。額外的輸出是在開始使用它之前在該位置發生的內存事件。

1

第一個循環終止於EOF,您不寫入data數組(因爲您不能)。

第二個循環終止於,這在data陣列中沒有任何地方。

我建議您在閱讀EOF後添加終止號'\0'

+0

...除非文件中的數據當然包含零字節。那麼你會打印少於預期的字符:) – pmg