2008-09-28 5 views
8
의 크기가 동일하지 않은

아주 간단하게 말해서, 나는 다음과 같은 코드가 있습니다끝 기록 된 데이터

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. 

왜 그입니다? 쓰여진 바이트 수가 파일 포인터와 일치하지 않는 이유는 무엇입니까?

+2

fopen() 인수에 NT 스타일 경로를 사용하지 않는 것이 좋습니다. Windows는 이식성이 뛰어나며 '\'를 이스케이프 처리 할 필요가없는 POSIX 경로도 지원합니다. – Terminus

답변

19

파일을 텍스트 모드로 열면 LF와 같은 줄 끝 표식이 CR/LF로 변환됩니다.

Windows에서 실행중인 경우 (아마도 파일 이름이 "c:\"으로 시작하는 경우 일 가능성이 높습니다).

인수 모드 :

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

C99 표준은이 7.19.5.3 The fopen function에서 말을 가지고 당신이 "wb" 모드에서 파일을 열 경우

, 난 당신이 숫자가 동일 찾을 수 있습니다 의심 문자열을 가리 킵니다. 문자열이 다음 중 하나 인 경우 해당 파일은 표시된 모드에서 입니다. 그렇지 않으면 동작이 정의되지 않습니다.
w 잘라 내기 길이 또는
a APPEND를 작성하기위한 텍스트 파일을 만들 제로에를 읽기위한

r 열려있는 텍스트 파일; 열거 나
wb 잘라 내기 길이 또는
ab APPEND를 작성하기위한 바이너리 파일을 생성 제로에를 읽는 파일 끝
rb 열린 이진 파일에 쓰기 위해 텍스트 파일을 만들; 열거 나에 쓰기 위해 이진 파일을 만들 파일 끝
갱신 (읽기 및 쓰기)
w+ 잘라 내기 길이가 0 또는 갱신
a+ APPEND 텍스트 파일을 생성하기위한 r+ 열려있는 텍스트 파일; 개방 또는 업데이트 (읽기와 쓰기)을위한 파일의 끝
r+b 또는 rb+ 열린 이진 파일에 쓰기, 업데이트에 대한 텍스트 파일을 작성
w+b 또는 wb+는 길이가 0 인 자르거나 업데이트 바이너리 파일을 생성
a+b 또는 ab+ 추가; 파일 끝

에서 작성, 열거 나 업데이트 바이너리 파일을 생성 당신은 그들이 wwb 구별 볼 수 있습니다. 나는 구현이 이 필요하다고 생각하지 않는다.이 두 가지를 다르게 다루지 만 바이너리 데이터에 바이너리 모드를 사용하는 것이 일반적으로 더 안전하다.

+1

이것은 다소 어둡습니다. 나는 두렵습니다. 그들이 그것에 물릴 때까지 하나는 거기에 있다는 것을 모르는 경향이 있습니다. 좋은 캐치! – fbrereto

+0

POSIX에서는 구현 방법을 다르게 ** 처리하지 말아야한다는 점에 유의할 가치가 있습니다. –

0

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

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

0

filepointer는 쿠키입니다. 가치가 없습니다. 당신이 그것을 사용할 수있는 유일한 방법은 파일에서 같은 장소를 찾는 것입니다. 나는 ISO C가 ftell이 값을 증가시키는 것을 보장하는지조차 확신하지 못합니다. 이걸 믿지 않으면 다른 seek() 모드를보십시오. 위치는 단순한 바이트 오프셋이 아니기 때문에 정확하게 존재합니다.

+0

그래,하지만 어떻게 든 * 구현해야합니다. 표준에 의해 지정되지 않은 경우에도 파일 포인터는 단순히 많은 구현에서 바이트 오프셋 일 뿐이므로 "아무런 가치가 없다"고 말하는 것은 너무 성급한 것입니다. – Tom

+0

쿠키가 아닙니다. 이진 모드에서 바이트 오프셋입니다. 텍스트 모드는 지옥이며 전혀 작동하는 것에 대해 거의 보장 할 수 없으며 단순히 사용하면 안됩니다. –

+0

@R .. : 보장하는 C 표준의 일부를 인용하십시오. 심지어 바이트 모드는 POSIX 확장입니다. – MSalters

0

windows는 실제로 플러시 및 fsync없이 파일에 모든 데이터를 쓰지 않습니다. 아마 그 이유가