2009-08-14 2 views
2

내가 실행하는 경우 :C++ FREAD 변경 또한 fgetpos 이상하게

FILE* pFile = fopen("c:\\08.bin", "r"); 
fpos_t pos; 
char buf[5000]; 

int ret = fread(&buf, 1, 9, pFile); 
fgetpos(pFile, &pos); 

내가 얻을 RET = 9 예상대로 내가

FILE* pFile = fopen("c:\\08.bin", "r"); 
fpos_t pos; 
char buf[5000]; 

int ret = fread(&buf, 1, 10, pFile); 
fgetpos(pFile, &pos); 

RET = 10 실행 그러나 경우 POS = 9

, 하지만 pos = 11!

어떻게 될 수 있습니까?

답변

8

당신은 바이너리 모드로 파일을 열 필요가 :

FILE * pFile = fopen("c:\\08.bin", "rb"); 

의 차이가 원인이되는 라이브러리가 생각하는 문자를 읽는 것은 줄 바꿈과 확장이다 - 바이너리 모드 확장을 방지 할 수 있습니다.

+2

C 표준에 명시된 바와 같이 : "[fgetpos()에 의해 저장된] 값은 fgetpos 함수를 호출 할 때 스트림을 해당 위치로 재배치하기 위해 fsetpos 함수에서 사용할 수있는 불특정 정보를 포함합니다." –

+0

내가 읽은 것처럼 표준어의 좋은 예로서! –

1

Windows의 문제입니다. 텍스트 모드에서 Windows는 쓰기에서 '\ n'을 'CR' 'LF'로 확장하고 읽기에서 'CR' 'LF'를 '\ n'으로 압축합니다. 텍스트 모드는 Windows의 기본 모드입니다. Neil이 언급 할 때 fopen()의 모드 문자열에 'b'를 추가하면 줄 바꿈이 해제됩니다. * nix 시스템에서는이 번역을 사용하지 않습니다.

관련 문제