- 締切済み
ファイルクローズ(fclose)でエラーを発生させる方法
ソースには一切手を加えず、(5)ファイルのクローズでエラー表示させる方法はないでしょうか。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp; /* (1)ファイルポインタの宣言 */ char s[256]; /* (2)ファイルのオープン */ /* ここで、ファイルポインタを取得する */ if ((fp = fopen("smpl.txt", "r")) == NULL) { printf("file open error!!\n"); exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */ } /* (4)ファイルの読み(書き)*/ while (fgets(s, 256, fp) != NULL) { /* ここではfgets()により1行単位で読み出し */ printf("%s", s); } if((fclose(fp)) == EOF){ /* (5)ファイルのクローズ */ Logging(cfancname, 2); printf("ファイルクローズに失敗しました\n"); return -1; } return 0; } 宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- titokani
- ベストアンサー率19% (341/1726)
本題とは関係ないのですが、 > exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */ > return -1; > return 0; 統一が取れていないのと、-1を返すのはあまりよろしくないかと。 上から順に、 return EXIT_FAILURE; return EXIT_FAILURE; return EXIT_SUCCESS; とするか、 return 1; return 1; return 0; がいいかと。
- Lchan0211
- ベストアンサー率64% (239/371)
たぶん、fclose()がエラーのケースで、 Loggingやprintfが正しく動作するか 走行確認したいのだと思いますが、 おそらくfclose()のエラーは、入力パラメータ(ファイルポインタ)が 不正なケースでしか発生しないと思います。 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fclose.3.html 私だったら、 if((fclose(fp)) == EOF){ /* (5)ファイルのクローズ */ の実行直前に、デバッガでfpの値をNULLに変更して続行させます。
- zwi
- ベストアンサー率56% (730/1282)
本物じゃないfopen~fcloseを作りリンクしてテストするしかないでしょう。 http://yougo.ascii.jp/caltar/%E3%82%B9%E3%82%BF%E3%83%96 こういう場合に使うモジュールをスタブと呼びます。
- tatsu99
- ベストアンサー率52% (391/751)
要は、動作確認をしたいが、動作確認後、ソースを変えたくない というのが、質問の趣旨であれば、 int ret;の変数を確保し if((fclose(fp)) == EOF){ /* (5)ファイルのクローズ */ を ret = fclose(fp); (1) if (ret == EOF){ (2) の2行に分けます。 デバッガで(1)を実行した後、(2)で止めます。 その後、ret にEOFの値をセットします。 その後、実行を再会します。 もちろん、デバッグ完了後も、 ソースは(1)と(2)に分けたままにしておきます。
- Tacosan
- ベストアンサー率23% (3656/15482)
環境依存かつとてもシビアなタイミングになりうるけど「ファイルが存在するデバイスそのものを切り離す」とかやるとできるかもしれない. 「(5)ファイルのクローズでエラー表示させる」の意味が今一つ分かりませんが. 純粋に「fclose の中でエラー表示させる」という意味だとむしろ「どれだけプログラムをいじっても無駄」だし.
- asuncion
- ベストアンサー率33% (2127/6289)
ソースに手を加えない、という条件下では、むずかしいのではないでしょうか。 もっとも、私が知らないだけかもしれませんけれど…。