- ベストアンサー
fread
freadで、a.txtの内容を画面出力するものです。 コピーした結果、 実際のテキストにある、 ! が書き込まれませんでした。 どこが、間違っているか教えてください。 FILE *fp; char str[20]; fp=fopen("a.txt","rb"); while(!feof(fp)){ fread(&str,(sizeof(str)-1),1,fp); if(feof(fp)) break; printf("%s",str); } return 0; }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
単純なテキストの処理ならfgets()を使うのが定石ですがそれはさておき。 #4さんの回答で方針はいいのですが、fread()は第二引き数で与えられた要素が何個読めたかを戻します。 従って、この場合は第二引き数と第三引き数を入れ替えるべきです。 また、この戻り値を使えばファイルの終端の検出が(事実上)できますのでループ全体は以下のようにすればいいでしょう。 尚、fclose()もお忘れなく。 -- for (;;) { int nLen = fread(str, 1, sizeof(str) - 1, fp); str[nLen] = '\0'; printf("%s", str); // 或いはfputs(str, stdout); if (nLen < sizeof(str) - 1) { break; } }
その他の回答 (4)
- redfox63
- ベストアンサー率71% (1325/1856)
freadの戻り値を使って strに nullを書き込むかどうかを決定しましょう int nLen = 0; nLen = fread( str, sizeof(str)-1, 1, fp ); str[nLen] = 0; printf( "%s", str ); if ( feof( fp ) ) { printf( "\n" ); break; } といった具合にしてみてください ...
お礼
回答ありがとうございます。 なんとなく、掴めました。 回答どうもありがとうございます。
- jacta
- ベストアンサー率26% (845/3158)
ルール違反かも知れませんが、一応指摘しておきます。 > fread(&str はNGだと思うよ。 > fread(str のハズ。 そんなことはありません。 &strとすれば、その型はchar (*)[20]ですので、配列全体を指すポインタになります。単なるstrの場合は、配列の1要素を指すポインタですね。
お礼
回答ありがとうございます。 strでも、&strでもいいようですね。 ありがとうございました。
- crew21
- ベストアンサー率26% (58/222)
ごめん、パッと見だけど、 fread(&str はNGだと思うよ。 fread(str のハズ。
お礼
素早い回答ありがとうございます。 strでやってみましたが、変化しませんでした。 レスありがとうございます。
- php504
- ベストアンサー率42% (926/2160)
if(feof(fp)) break; printf("%s",str); の順番だと最後に読み込んだstrが出力される前に終わってしまいますよ。 順番を変えるか printf("%s",str); if(feof(fp)) break; またはbreakは不要なので printf("%s",str); だけでもよさそうですが。
お礼
素早い回答ありがとうございます。 順番を変えるか またはbreakは不要なので printf("%s",str); だけでもよさそうですが。 やってみましたが、今度は余計な文字が文末に書き込まれました。 It seems to me that most of the "new" programming languages. を読み込むと、 It seems to me that most of the "new" programming languages. ming languages となり余計な文字列が書きこまれるようです。
お礼
回答ありがとうございます。 解説どうもありがとうございます。 おかげさまで、何とか解決できました。 どうもありがとうございました。