- ベストアンサー
fgetsでファイルの内容を読み込む
キーボードから読みたいファイル名を入力し 指定した行数だけファイルの内容を出力する プログラムを作りました。 ちゃんと動作するソースは作れたのですが、 へんなところ(無駄な文など)がないか どなたか見て頂けないでしょうか。 ソースが長くて申し訳ありません。 課題で、答えはあるのですが、ソースを チェックしてもらえる人が回りに いない状況です。 どうぞ宜しくお願いします。 printf("出力するファイル名を入力してください-->"); gets(s); while((fp = fopen(s, "r")) == NULL) { printf("指定されたファイルがありません\n"); printf("再度入力して下さい-->"); fflush(stdin); gets(s); } printf("出力する行数を入力して下さい-->"); fflush(stdin); scanf("%d",&l); while(fgets(s, 256, fp)!=NULL){ printf("%s", s); l--; if(l==0){ fclose(fp); return 0; } } fclose(fp);
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
個人的な好みでは、 ・if(l==0)の条件が成立したら、break;でループを抜けるほうが好き ・ファイルの終端を調べるのは foef()を使うのが好き do{ ... }while(feof(fp)); とか有りますが、、。
その他の回答 (2)
- toysmith
- ベストアンサー率37% (570/1525)
ファイルオープンエラーが必ず「ファイルが存在しない」とは限らない。 errnoを見て適切な判断をするべき。 ファイルのアクセス権がないだけかもしれない、ファイルが使用中でシェアアクセスが許されていないかもしれない、etc... gets()とscanf()を混在させているのが気持ち悪い。 #2の方の指摘にもありますが、scanf()を使った場合、どうしてもエラーチェックが難しくなります。 %dに対して'a'と入力されてもscanf()が0を返すだけで、実際の入力データはわからない。 「fgets()で受け取って,strtol()で数値変換。入力ミスがある場合はミスを指摘するようなメッセージを出す。」という手順が(個人的に)好きです。 ファイルがフロッピーに存在するとき、オープンに成功したあと、フロッピーを抜かれたらどうなりますか? (恐らくOS依存の動作となる)
お礼
丁寧な回答ありがとうございます。 >ファイルオープンエラーが 必ず「ファイルが存在しない」とは限らない。 >%dに対して'a'と入力されても scanf()が0を返すだけで、 実際の入力データはわからない。 >ファイルがフロッピーに存在するとき、 オープンに成功したあと、 フロッピーを抜かれたら 三点指摘いただいた内容、全て思考の外に ありました。 まだ実務についていないのですが、 なるべく経験のある方について教えていただくように しながらやっていきたいと思います。 ありがとうございました。
- tatsu99
- ベストアンサー率52% (391/751)
今回はこの考え方で良いと思いますが、実際の業務で使用するプログラムの場合は、もっと厳密なエラーチェックが必要となります。 例えば以下の点です。 1.get(s)で確保するサイズはchar s[256]としていると思いますが、キーボードから256を越えたデータを打ち込まれたらどうするか? 2.1行のデータが256バイト以内であると言う前提なら良いが、1行のデータが500バイトのデータならどうするのか? 3.行数の入力で、負の値、0の値、数値でない値をいれたらどうなるのか? 上記のことに耐えられるプログラムであれば、完璧です。しかしながら、今回は、基本的な処理の理解が目的ですので、これで良いでしょう。これから、実際にプログラムを作っていかれると思いますが、以下の点を頭にいれていくと、良い堅牢なプログラムが作成できるようになります。 1.オペレータは常に正しいデータを入力するとは限らない。(プログラマにとって都合の良いデータを入力するとは限らない) 2.ファイル、データ等を読み書きする時、 最大値に制約(又は前提)を設けて良いのかどうか(今回なら1行は256バイト以内と言う制約、又は前提) この場合、制約を256バイトにするのは良いが、もし、256バイトを越えてもプログラムが異常終了しないようにする対策は必要です。
お礼
ありがとうございます。 エラーチェックについて丁寧な解説を頂き、 勉強になりました。 プログラミングは 「あっ、できた」だけではなく、 完成したシステムをイメージしないといけないんですね。 下っ端の見習いなので、すぐに結果が出るような ことはないと思いますが、これから勉強するに あたって心がけます。 ありがとうございました。
お礼
ありがとうございます。 ifを書いてから「終わるのはどうするんだろう?」と なにげなくreturnを書いていました。 if→break;で覚えておきます。 do whileも思い出しました。習ったけれど、 自分で使ったことはない書き方です。 ありがとうございました。