2017-07-02 9 views
-1

配列var [i]は、すべてのドライブの名前をlog.txtから読み込み、画面に出力します。その後、配列は '\ 0'に達するまで最初の文字だけが印刷されるまで印刷されます。なぜ分かりませんか?ファイルから読み取った後の文字配列の出力の問題

FILE *fp; 
char var[512]; 
i = 0; 

if (fp = fopen("log.txt", "r+")) { 
    while (fscanf(fp, "%c", &var[i]) != EOF) { 
     printf("%c", var[i]); -----------> Works Fine 
     i++; 
    } 
} 

fclose(fp); 
printf("\n\n"); 

i = 0; 
while(var[i] != '\0') { 
    printf("%c",var[i]);  ------------------> Problem 
    i++; 
} 

出力:あなたは私に= 0を削除する必要が

■N a m e 
C : 
D : 
E : 
F : 
G : 


 ■N   -------------> Problem 
+0

'' \ 0 '終了が含まれていないvar'、第二ループがランダムに停止するか、プログラムがクラッシュする可能性があります。一文字を読んでいるのであれば、代わりに 'fscanf'、ise' fgetc'を使わないでください。 'fgets'を使って行全体を読み込んで解析する方が良いでしょう。 – Pablo

+0

私が気に入らないもう一つのことは、 'log.txt'ファイルに512バイトを超えないと仮定していることです。そのようなことを想定するのは危険です。一般的には、ユーザーの入力(およびそれもファイルを意味する)を信頼できないものとして扱うべきです。あなたはそのような苦しいバグを避けるでしょう。 – Pablo

+0

@パブロlog.txtのサイズが不明であるとしましょう。そのような場合、配列に最大サイズしか割り当てられません。 –

答えて

-1

。なぜなら、1文字だけが印刷される理由は0に初期化されるからです。

+0

いいえ、問題は '\ 0'が' var'に書き込まれたことがなく、2番目の 'i = 0'がそれをさらに悪化させることを意味します。最初の場所 – Pablo

1

while -loopが探している'\0'は書かれません。 だから、あなたが文字で読んで最初のループの後

... 
var[i] = '\0'; 
fclose(fp); 
... 

を書いて、それが動作するはずです。

代わりに(またはそれに加えて)、あなたはそれがあるように、あなたの配列を初期化することができ、「事前に充填された」のように、0で:

char var[512] = { 0 }; // will set all 512 characters to 0. 
+0

応答をありがとうが、その動作しません。 o/pはまだ同じです。 –

+0

あなたの例とあなたのコードは同じではありません。 'char var [512] = {0};を除いてあなたのコードのコピーと貼り付けを行いました。 '行とそれは必要なように働いた。 'log.txt'は実際には8バイト長です。たぶんあなたのものが512より長くなって、入力があなたの固定サイズよりも長くなることがないと仮定したときに得られる奇妙な問題が表示されます。 – Pablo

関連する問題