견고한 표준 솔루션이 없습니다.
C는 오류를 시뮬레이트하거나 심지어 FILE*
오류 표시기을 설정하는 명확한 방법을 제공하지 않습니다.
테스트 코드는 컴파일러/플랫폼에 따라 FILE
의 오류 표시기을 설정할 수 있습니다. 아마 간단한 대안
#define SIM_ERROR(stream, ret) \
while (1) {if (my_rand()==0) { (stream)_flags |= __SERR; (ret) = 0;} }
ret = fread(ptr, size, nmemb, stream);
SIM_ERROR(stream, ret);
, 약간 더 휴대용 접근법 등. 코드는 테스트 중에 표준 라이브러리에 대한 임시 교체로 자체 기능을 사용하여 오류를 일으킬 수 있습니다.
int my_error_indicator = 0;
intptr_t my_stream = 0;
size_t my_fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream) {
if (rand() == 0) {
my_error_indicator = 1;
my_stream = (intptr_t) stream;
return 0;
}
return fread(ptr, size, nmemb, stream);
}
int my_ferror(FILE *stream) {
if (my_error_indicator && (intptr_t) stream == my_stream) {
return my_error_indicator;
}
return ferror(stream);
}
void my_clearerr(FILE *stream) {
if ((intptr_t) stream == my_stream) {
my_stream = NULL;
my_error_indicator = 0;
}
clearerr(stream);
}
#define fread my_fread
#define ferror my_ferror
#define clearerr my_clearerr
교체 fclose(), rewind()
그들이 드 할당 및/또는 오류 표시를 지우 너무으로 필요하다.
여러 스트림의 오류는 여기에서 처리되지 않습니다.
일반 파일의 읽기 오류는 발생하기가 쉽지 않으므로 대개 디스크 오류가 발생합니다. 오류를 유발할 수있는 수정 된 라이브러리와 링크해야 할 수도 있습니다. – Barmar
'feof()'는 파일 끝이 감지되면보고하고, fread()는 0을 반환하면 feof()가 "오류가 발생했습니다"라는 표시가 아니어야합니다. 'ferror()'를 사용하여 "오류가 발생했는지"를 탐지하십시오. – chux