• ベストアンサー

このプログラムは

どこかおかしいですか? int main(void){ FILE *str; char buf[1000]; if((fp=fopen("ファイル名","r"))=NULL){ printf("ファイルが開けません"); return EXIT_SUCCESS; } while(fgets(buf,1000,fp) !=NULL){ str=buf; printf("%s",buf); } return EXIT_SUCCESS; } で実行すると前半4割程度が表示されません。 何故だかわかる人いませんか? 使用言語:C言語 環境:visualC++6.0 のコンソールアプリケーション。

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.8

>途中から最後までが表示され あぁ、読んでなかったから気づかなかったけど なんとなく勘違いしているような気がします。 恐らくコンソールのページが表示し切れなくなって 前半のファイル内容が見えないと思っているだけでは。。。? #include <stdio.h> int main(void) { FILE *fp; fp = fopen("hoge.txt","r"); if( NULL == fp ) { printf("ファイルが開けません"); return 0; } while(!feof(fp)) { char buf[1024]; fgets(buf,sizeof(buf),fp); printf("%s",buf); getchar(); } fclose(fp); return 0; } 見たいに1行ずつ表示してみれば、最初から表示されている事が 分かると思います。

その他の回答 (9)

  • boro-pc
  • ベストアンサー率30% (64/208)
回答No.10

#3です(問題が確認できませーん) #8さん>恐らくコンソールのページが表示し切れなくなって #8さん>前半のファイル内容が見えないと思っているだけでは。。。? あ、言っちゃいましたね きっと皆さんまさかと思いつつ気にしてたと思いますけど… まぁその変の疑いも含めてやってみてほしいのは 1.printfじゃなくってファイルに掃き出す 2.その消えてる4割だけのテキストファイルにしてみて結果がどうなるか? 3.それでも消えてるって言うのであればbufをprintするところでブレークはりましょう きっと何か解るはず

minaraiH
質問者

補足

2をやってみたらちゃんとできたので#8さんのおっしゃった線かな と思います。ありがとうございました

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.9

>開発用のPCじゃネット繋げないし >ネット用のPCではVisualC++が使えないので >コピ&貼り付けはできないのです。 #6です。 なるほど、そういった事情でしたか。それではやむを得ないですね。 大変失礼いたしました。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.7

fgetsはファイル終端に達した場合確かにNULLを返しますが、 それ以外のエラーでもNULLを返す可能性が有ります。 >while(fgets(buf,1000,fp) !=NULL) というコードに対し、途中でエラーが発生すれば、 もちろんそこで読み込みが終ってしまいます。 例えば、feofを使うとか。 #include <stdio.h> int main(void) { FILE *fp; fp = fopen("hoge.txt","r"); if( NULL == fp ) { printf("ファイルが開けません"); return 0; } while(!feof(fp)) { char buf[1024]; fgets(buf,sizeof(buf),fp); printf("%s",buf); } fclose(fp); return 0; }

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.6

>すいません手書きなもので・・ >=じゃなくて==になってます プログラムが1文字違っただけでも正しく動作しないことは、よくご存じかとおもいます。ここに投稿なさる場合は、プログラムを転記するのではなく、プログラムをコピーして、張り付けて下さい。 それにより、いらぬ誤解を招くことがなくなります。 また、プログラムは、出来る限り、全ての部分を提示するようにして下さい。質問者が、特に提示する必要がないと判断し、ここに、提示しない場合が、よくあります。しかしながら、全てを提示するように要求し、全てのソースをみると、最初に提示されていないところにバグの原因があることが、しばしばありました。ですので、本当のバグはあなたが考えていないところにもあるということをご理解下さい。 今回の直接の回答にはなっていませんが、ご了承下さい。

minaraiH
質問者

補足

開発用のPCじゃネット繋げないし ネット用のPCではVisualC++が使えないので コピ&貼り付けはできないのです。

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.5

> どこかおかしいですか? > 実行すると前半4割程度が表示されません。 どんな結果を期待しているのか分からないので、 どこがおかしいともいえません、 おかしいところはありますが、 その様に意図して作ったのでは無いのですか? 違うのなら、どの様な結果を期待しているか 補足をお願いします。

minaraiH
質問者

補足

私が作ったのはファイルから一行ずつ読み込んで表示するプログラムです。 当然そのファイル内の全文の表示を期待しています。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

FILE *fp; char *str; の間違いですよね strは何も使ってないし原因はここに書かれていない部分にありそうな気がします

minaraiH
質問者

補足

int main(void){ FILE *fp; char buf[1000]; if((fp=fopen("ファイル名","r"))=NULL){ printf("ファイルが開けません"); return EXIT_SUCCESS; } while(fgets(buf,1000,fp) !=NULL){ printf("%s",buf); } return EXIT_SUCCESS; } です。ミス多くてすいません。 少し試したのですがbufのサイズを40にすると 最初からずらっと出て途中まで表示されます。 サイズを1000に戻すとまた途中から最後までが表示され 始めの4割程度が表示されません。。

  • boro-pc
  • ベストアンサー率30% (64/208)
回答No.3

情報不足色々ありそうですがとりあえず見える範囲で一点 >if((fp=fopen("ファイル名","r"))=NULL){ 代入してますけど…

minaraiH
質問者

補足

すいません手書きなもので・・ =じゃなくて==になってます

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

No.1です。 追加質問です。 Q1.ファイルはASCIIコード(半角英数字)のみで構成されていますか? Q2.「前半」とは、一行の前半ですか? それともファイルの前半ですか? Q3.一行の長さは1000Byte未満ですか? Q4.一行の長さとbuf[]のサイズを小さくしても同様の現象は発生しますか? 状況から考えると、2Byte文字の読み込み失敗や、途中にNULL文字(0x00)が入っているか、 もしくはprintf("%s")が文字列の長さに対応しきれずに表示できないと考えるのが妥当ですが。

minaraiH
質問者

補足

>>Q1.ファイルはASCIIコード(半角英数字)のみで構成されていますか? 半角英数字のみです >>Q2.「前半」とは、一行の前半ですか? それともファイルの前半ですか? ファイルの前半です。 >>Q3.一行の長さは1000Byte未満ですか? 未満です。一行が長い文だけ表示されないのではなく 前半4割がまるまま表示されません。 Q4.一行の長さとbuf[]のサイズを小さくしても同様の現象は発生しますか? サイズを100とか40にしても変化ないです

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

そもそもの問題点として、"ファイル名"のファイルはテキストファイルですか? あとは、 >str=buf; は全く意味を持ちませんが、どこかソースを端折っていすませんよね?

minaraiH
質問者

補足

テキストファイルです。 本来はもう少し長いプログラムなのですが、とりあえず ファイルから一行ずつ表示するプログラムを書きました。

関連するQ&A