2016-03-02 140 views
0

所以我打印字符的文件,每當行結束它只是做一些奇怪的事情。打印字符到文件給出奇怪的結果

這是我使用的代碼:

void opdracht43() { 
    FILE *file; 
    FILE *file2; 
    file = fopen("opdracht1.1.cpp", "r"); 
    file2 = fopen("Disc.c", "w"); 
    int p; 
    char a[100]; 
    while (fgets(a, 100, file)) { 
     for (int i = 0; i < sizeof a; i++) { 
      if (a[i] == '\n' || a[i] == ' ' || a[i] == '\t') { 
       printf("TRUE"); 
      } 
      else { 
       printf("FALSE"); 
       fputc(a[i], file2); 
      } 
     } 
     return 0; //So it only prints the 1st line for now. 
    } 
    fclose(file); 
    fclose(file2); 
} 

而當它運行,這是它賦予文字:

#include<stdio.h> ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ 

之間>我的空間給我在記事本中一個奇怪的黑色NUL ++

該文件的第一行是:

#include<stdio.h> 

我希望我可以在這裏找到一些幫助:)

+2

將其寫入「Disc.c」總是試圖輸出100個字節(跳過空格)。但是當輸入中遇到'\ 0'時,你應該跳出for循環,因爲這標誌着'fgets'讀取的結尾。否則,你正在輸出過去有效的輸入,因此垃圾結果。 – kaylum

+1

擴展@kaylum評論,'我

+0

'for(int i = 0; i 'for (size_t i = 0; a [i]; i ++){' – chux

回答

0

變化

for (int i = 0; i < sizeof a; i++) { 

for (int i = 0; a[i] != '\0' && i < sizeof a; i++) { 

在你的情況,在fgets()第一個電話給陣列a這些值: '#', '我', 'N',「C ',...,'o','。','h','>'和'\ 0'。但是,a的其餘部分仍然包含Ì等垃圾,因爲a從未初始化。

'\ 0'只是你提到的「奇怪的黑色nul」。 '\ 0'是C風格字符串結尾的信號,但它不代表文件結尾,所以不應該使用fputc()

-1

sizeof a是以字節爲單位的變量a的大小,這始終是100你想在a舉行的一個字符串的長度,封頂您的環路是strlen(a)

此外,您不應該逐字符寫入文件流。這不是文件I/O設計工作的方式。

+0

一次寫入一個字符並不是真正的問題,因爲它被緩存並且正在過濾輸出以刪除某些字符)。將過濾的序列存儲在另一個緩衝區中沒有任何好處(因爲您意味着更好)。 –

+0

C中的流實際上被設計爲一次寫入或讀取一個字符。 'fgetc'和'fputc'是原語,你會發現其他流函數是通過調用一個字符原語來實現的(或者你曾經習慣過) –