프리드가 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
'programing' 카테고리의 다른 글
node.js를 이용한 이미지 업로드, 표시 및 저장 방법 및 표현 방법 (0) | 2023.09.19 |
---|---|
X, Y, Z 데이터, Excel 또는 기타 도구에서 3D Ploting (0) | 2023.09.19 |
mySQL에서 SQL Server 함수 SCOPE_IDENTITY()의 등가? (0) | 2023.09.19 |
gcc의 -m32 옵션은 언제 사용해야 합니까? (0) | 2023.09.19 |
Oracle 'INSERT ALL'에서 중복 무시 (0) | 2023.09.19 |