programing

프리드가 EOF에 일찍 도달하는 이유는 무엇입니까?

codeshow 2023. 9. 19. 21:32
반응형

프리드가 EOF에 일찍 도달하는 이유는 무엇입니까?

파일을 메모리에 읽어주는 C 라이브러리를 쓰고 있습니다.파일의 처음 54바이트(헤더)를 건너뛰고 나머지를 데이터로 읽습니다.fseek을 사용하여 파일의 길이를 결정한 다음 fread를 사용하여 파일을 읽습니다.

EOF에 도달했기 때문에 루프가 한 번 실행된 다음 종료됩니다(오류 없음).마지막에 바이트Read = 10624, ftell(stream) = 28726이며 버퍼는 28726 값을 포함합니다.EOF에 도달하면 fread는 30,000바이트를 읽고 파일 위치는 30054가 될 것으로 예상합니다.

C는 제 모국어가 아니라서 어딘가 바보 같은 초보자 실수가 있는 것 같습니다.

코드는 다음과 같습니다.

const size_t headerLen = 54;

FILE * stream;
errno_t ferrno = fopen_s( &stream, filename.c_str(), "r" );
if(ferrno!=0) {
  return -1;
}

fseek( stream, 0L, SEEK_END );
size_t bytesTotal = (size_t)(ftell( stream )) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
    size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
    bytesRead+=result;
}

사용하는 참조에 따라 모드 플래그에 "b"를 추가하는 것이 답임이 분명합니다.골머리배지 후보를 찾고 있습니다. :-)

참고 문헌은 두 번째 단락, 두 번째 문장(표에는 없지만)에서 그것에 대해 이야기합니다.

MSDN은 페이지의 중간까지 이진 플래그에 대해 논의하지 않습니다.

OpenGroup은 "b" 태그의 존재를 언급하지만 "효과가 없을 것"이라고 말합니다.

아마도 바이너리 모드 문제일 것입니다.파일 열기를 다음과(와)"r+b"모더지로서

편집: 주석에 언급된 바와 같이"rb"당신의 원래 의도와 더 잘 맞는 것 같습니다."r+b"읽기/쓰기를 위해 열 것입니다."rb"읽기 전용입니다.

또한 단순히 링크 명령에 binmode.obj를 포함하는 것만으로도 모든 파일이 열릴 때 사용할 수 있다는 점에 유의할 필요가 있습니다.

이전 답변에 기반한 솔루션:

    size_t bytesRead = 0;
    BYTE* localBuffer = new BYTE[bytesTotal];
    fseek(stream,headerLen,SEEK_SET);
        while(!feof(stream) && !ferror(stream)) {
        size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-
        bytesRead,stream);
    bytesRead+=result;
}

언급URL : https://stackoverflow.com/questions/164002/why-is-fread-reaching-the-eof-early

반응형