2010-12-14 7 views
2

내가 특정에 파일 오프셋 (간체 버전)를 읽을려고에 도달하지 않을 때 진정한 반환 : 데이터가 1008 바이트를 포함하지 않습니다,무엇이 일어 났는지를 결정하기 위해 feof() EOF가

typedef unsigned char u8; 
FILE *data_fp = fopen("C:\\some_file.dat", "r"); 
fseek(data_fp, 0x004d0a68, SEEK_SET); // move filepointer to offset 
u8 *data = new u8[0x3F0]; 
fread(data, 0x3F0, 1, data_fp); 
delete[] data; 
fclose(data_fp); 

문제가된다을, 그러나 529 (무작위로 보인다). 529 바이트에 도달하면 feof (data_fp)를 호출하면 true가 반환됩니다.

나는 또한 작은 덩어리 (한 번에 8 바이트)로 읽으려고했으나 아직 없으면 EOF를 치는 것처럼 보입니다.

16 진수 편집기의 간단한 모양은 there are plenty of bytes left입니다.

+0

@pmg malloc/free를 사용하면 내 문제는 해결되지 않지만 자신에게 적합합니다. –

+1

C (C++은 잘 모르겠습니다) 이진 모드에서 파일을 열어 봅니다. – pmg

+0

@pmg, 젠장! 그것은 간단했습니다 ... 대답을 만들어주십시오. 나는 그것을 받아 들일 것입니다. –

답변

4

파일을 텍스트 모드로 열면 라이브러리에서 일부 파일 내용을 다른 것으로 변환하여 부당한 EOF 또는 잘못된 오프셋 계산을 유발할 수 있습니다.

열고 fopen을 호출

fopen(filename, "rb"); 
1

다른 응용 프로그램에서 파일을 병렬로 쓰고 있습니까? 아마도 경쟁 조건이 있기 때문에 읽기가 중단 될 때마다 파일이 끝나고 나중에 읽기를 수행 할 때 나머지는 기록됩니다. 그것은 임의성을 설명 할 수도 있습니다.

+0

아니요! 그것은 다른 응용 프로그램에서 읽었지만 파일을 닫거나 파일을 복사하고 경로를 변경하면 동일한 결과가 나타납니다. 이상하게도 난수 (529)는 항상 동일합니다. –

1

에 "B"옵션을 전달하여 바이너리 모드로 파일은 어쩌면 그것은 텍스트와 바이너리 파일의 차이입니다. Windows에서 사용하는 경우 CRLF는 파일의 두 문자이지만 읽은 경우에만 하나의 문자로 변환됩니다. fopen (..., "rb")을 사용하여 시도하십시오.

0

컴퓨터에서 링크가 보이지 않지만 더 이상 바이트가 없다고 주장하면 믿을 수 있습니다. 16 진수 편집기에서 직접 파일 크기를 인쇄하지 마십시오.

또한 레벨 2 I/O를 사용하는 것이 더 좋을 것입니다. f- 호출은 고대 C 추리이며 C + +는 새로운 것이므로 사용하고 있습니다.

int fh =open(filename, O_RDONLY); 
struct stat s; 
fstat(fh, s); 
cout << "size=" << hex << s.st_size << "\n"; 

지금 당신의 추구 빠른 어쨌든있는 2 I/O 호출을, 레벨을 사용하여 읽기를 수행하고의 파일 의 크기가 정말이 무엇인지 살펴 보자.

+0

대부분의 경우 f- 호출 저레벨은 버퍼링되지 않기 때문에 버퍼링되기 때문에 빠릅니다. 이 경우 읽기가 하나뿐이므로 문제가되지 않습니다. –

+0

속도를 원한다면, 오래된 정크 레이어를 사용하지 마십시오. C api 레이어에 정크 레이어가 있습니다. 많은 양의 읽기 작업을 수행하려면 고성능 버퍼링 클래스가 필요합니다. – Dov

관련 문제