プロが教える店舗&オフィスのセキュリティ対策術

ソースには一切手を加えず、(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;
}

宜しくお願いします。

A 回答 (6件)

本題とは関係ないのですが、


> exit(EXIT_FAILURE); /* (3)エラーの場合は通常、異常終了する */
> return -1;
> return 0;
統一が取れていないのと、-1を返すのはあまりよろしくないかと。
上から順に、
return EXIT_FAILURE;
return EXIT_FAILURE;
return EXIT_SUCCESS;
とするか、
return 1;
return 1;
return 0;
がいいかと。
    • good
    • 0

たぶん、fclose()がエラーのケースで、


Loggingやprintfが正しく動作するか
走行確認したいのだと思いますが、
おそらくfclose()のエラーは、入力パラメータ(ファイルポインタ)が
不正なケースでしか発生しないと思います。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …

私だったら、
if((fclose(fp)) == EOF){ /* (5)ファイルのクローズ */
の実行直前に、デバッガでfpの値をNULLに変更して続行させます。
    • good
    • 0

本物じゃないfopen~fcloseを作りリンクしてテストするしかないでしょう。


http://yougo.ascii.jp/caltar/%E3%82%B9%E3%82%BF% …
こういう場合に使うモジュールをスタブと呼びます。
    • good
    • 0

要は、動作確認をしたいが、動作確認後、ソースを変えたくない


というのが、質問の趣旨であれば、
int ret;の変数を確保し
if((fclose(fp)) == EOF){ /* (5)ファイルのクローズ */

ret = fclose(fp); (1)
if (ret == EOF){  (2)
の2行に分けます。
デバッガで(1)を実行した後、(2)で止めます。
その後、ret にEOFの値をセットします。
その後、実行を再会します。
もちろん、デバッグ完了後も、
ソースは(1)と(2)に分けたままにしておきます。
    • good
    • 0

環境依存かつとてもシビアなタイミングになりうるけど「ファイルが存在するデバイスそのものを切り離す」とかやるとできるかもしれない.


「(5)ファイルのクローズでエラー表示させる」の意味が今一つ分かりませんが. 純粋に「fclose の中でエラー表示させる」という意味だとむしろ「どれだけプログラムをいじっても無駄」だし.
    • good
    • 0

ソースに手を加えない、という条件下では、むずかしいのではないでしょうか。


もっとも、私が知らないだけかもしれませんけれど…。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!