다음 프로그램이 유효한 C 프로그램입니까?C 표준 라이브러리 코너 사례
#include <stdio.h>
int main()
{
fwrite("x", 1, 1, stderr);
fflush(stderr);
fgetc(stderr);
fwrite("y", 1, 1, stderr);
return 0;
}
stderr에서 읽으려고합니다.
xy
의미가 있습니다 :
I 2008 Visual C++에서 컴파일 및 실행
, 나는 다음과 같은 출력을 얻을. 그러나 stderr을 파일 (test.exe 2> foo.txt
)로 리디렉션하면 "디버그 어설 션 실패"창이 나타납니다. "일관성없는 스트림 수. 연속 읽기 및 쓰기간에 플러시". 읽기와 쓰기 사이에
fflush
을 추가하면 문제가 해결됩니다. (이것은 디버그 빌드에서 발생합니다. 릴리스 빌드에서는 두 번째 쓰기가 자동으로 실패합니다).
이 동작이 정확합니까? 아니면
컴파일러
라이브러리 버그입니까? 읽거나 쓰기가 C. 불법 때 내가 설명 어디서나 어떤 규칙을 찾을 수 없습니다
출력 스트림에서 읽기가 정의되지 않은 동작입니다. 그리고 지구상에서 무엇을 기대합니까? –
컴파일러 버그는 아니지만 라이브러리 구현 버그입니다. –
@NeilButterworth - 출력 스트림을 읽는 것이 UB를 발생시켜야한다고 생각하지 않습니다. Opengroup에 따르면 fgetc가 실패하고 errno를 EBADF로 설정해야합니다 (http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html 참조). –