前提・実現したいこと
今、テストケース・テストデータの作成しています。
このコードの35行目で、ファイル読み込みエラーを再現したいのですが、どういう時に発生しますか。
C
1#include<stdio.h> 2#include<stdlib.h> 3 4typedef struct 5{ 6 char name[16]; /* 名前 */ 7 long hp; /* HP */ 8 long mp; /* MP */ 9 char level; /* レベル */ 10 char strength; /* 強さ */ 11 char speed; /* 素早さ */ 12 char wisdom; /* 賢さ */ 13 long experience; /* 経験値 */ 14}S_STATUS; 15 16void main(void) { 17 FILE *fp = NULL; 18 S_STATUS character[3] = { 0 }; 19 int i = 0; 20 21 fp = fopen("test.txt", "rb"); 22 23 if (fp == NULL) { 24 printf("ファイルオープンエラー"); 25 exit(EXIT_FAILURE); 26 } 27 28 29 for (i = 0; i < sizeof(character) / sizeof(character[0]); i++) { 30 31 fread(character, sizeof(S_STATUS), 1, fp); 32 33 if (feof(fp) == 0) { 34 if (ferror(fp) != 0) { /* ferror関数 */ 35 printf("ファイル読み込みエラー"); /* 0 = 正常 */ 36 break; /* 0 != 異常 */ 37 } 38 } else { 39 break; 40 } 41 } 42 43 fclose(fp); 44} 45
試したこと
テストデータである「test.txt」を構造体のバイト数分(96バイト)以外にしたり、0バイトのデータを読みこませたり、
読み取り専用にしましたが、「ファイル読み込みエラー」を再現できなかった。
エラー処理が正しく動作するかの確認が目的でしたら、デバッガーで強制的に fread関数の返却値をエラーにするとかは如何でしょうか。
質問のソースでしたら、ステップ実行して、強制的にエラー処理に入るように、実行位置を変更するという手段もあるかと思います。
単体テストのレベルではこれで十分な気もしますが、システムレベルでエラー処理を担保するのであれば、ライブラリーでエラーを発生させる、OS やドライバ階層で考慮する等が考えられます。
デバッガーで強制的に fread関数の返却値をエラーにする方向で対処しました。
ご回答頂き、ありがとうございます。
回答2件
あなたの回答
tips
プレビュー