문제

간단히 말해서 다음 코드 스 니펫이 있습니다.

FILE* test = fopen("C:\\core.u", "w");
printf("Filepointer at: %d\n", ftell(test));
fwrite(data, size, 1, test);
printf("Written: %d bytes.\n", size);
fseek(test, 0, SEEK_END);
printf("Filepointer is now at %d.\n", ftell(test));
fclose(test);

그리고 출력 :

Filepointer at: 0
Written: 73105 bytes.
Filepointer is now at 74160.

왜 그런 겁니까? 작성된 바이트 수가 파일 포인터와 일치하지 않는 이유는 무엇입니까?

도움이 되었습니까?

해결책

텍스트 모드에서 파일을 열기 때문에 LF와 같은 종료 마커를 CR/LF로 변환합니다.

Windows에서 실행중인 경우 (그리고 파일 이름이 "c:\").

파일을 열면 "wb" 모드, 숫자가 동일하다고 생각합니다.

FILE* test = fopen("C:\\core.u", "wb");

C99 표준은 이것을 말할 수 있습니다 7.19.5.3 The fopen function:

인수 모드는 문자열을 가리 킵니다. 문자열이 다음 중 하나 인 경우 파일은 표시된 모드에서 열립니다. 그렇지 않으면 동작이 정의되지 않습니다.

r 읽기를위한 열린 텍스트 파일
w 길이가 0으로 자르거나 쓰기 위해 텍스트 파일을 만듭니다.
a 추가; 파일 끝에서 쓰기 위해 텍스트 파일을 열거 나 만듭니다
rb 읽기를 위해 바이너리 파일을 엽니 다
wb 길이가 0으로 자르거나 쓰기 위해 이진 파일을 만듭니다.
ab 추가; 파일 끝에서 쓰기 위해 바이너리 파일을 열거 나 작성하십시오
r+ 업데이트를위한 열린 텍스트 파일 (읽기 및 쓰기)
w+ 길이가 0으로 자르거나 업데이트를 위해 텍스트 파일을 만듭니다.
a+ 추가; FILE END-OF FILE에서 작성, 업데이트 용 텍스트 파일을 열거 나 만듭니다.
r+b 또는 rb+ 업데이트를위한 바이너리 파일 열기 (읽기 및 쓰기)
w+b 또는 wb+ 길이가 0으로 자르거나 업데이트를 위해 이진 파일을 만듭니다.
a+b 또는 ab+ 추가; 업데이트를 위해 바이너리 파일을 열거 나 생성, 파일 끝에서 쓰기

당신은 그들이 구별되는 것을 볼 수 있습니다 w 그리고 wb. 나는 구현이 믿지 않는다 필수의 두 가지를 다르게 처리하려면 이진 데이터에 이진 모드를 사용하는 것이 일반적으로 더 안전합니다.

다른 팁

fwrite는 무엇을 반환합니까? 일반적으로 반환 값은 작성된 바이트 수입니다. 또한 ftell ()은 fseek 직전에 무엇을 대답합니까?

운영 체제, C 컴파일러 버전 및 C 라이브러리를 아는 데 도움이 될 수 있습니다.

파일링터는 쿠키입니다. 가치가 없습니다. 당신이 그것을 사용할 수있는 유일한 것은 파일의 같은 장소를 찾는 것입니다. ISO C가 FTELL이 증가하는 값을 반환한다고 보장하는지조차 확실하지 않습니다. 당신이 이것을 믿지 않는다면, 다른 seet () 모드를보십시오. 위치가 간단한 바이트 오프셋이 아니기 때문에 정확하게 존재합니다.

Windows는 실제로 모든 데이터를 플러시 및 fsync없이 파일에 기록하지는 않습니다. 어쩌면 그게 이유 일 것입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top