fseek를 사용하여 eof뒤로 밀면?
글쓴이: 익명 사용자 / 작성시간: 목, 2002/11/28 - 3:01오후
#include
main()
{
FILE *fp;
fp = fopen("./ftest.txt", "r+");
printf("start..pos->[%ld]\n", ftell(fp));
fseek(fp, 20, SEEK_SET);
printf("now..pos->[%ld]\n", ftell(fp));
fprintf(fp,"this..");
printf("end..pos->[%ld]\n", ftell(fp));
}
위의 소스를 실행하면...
start..pos->[0]
now..pos->[20]
end..pos->[26]
위와 같은 결과가 나옵니다.
처음에 열기전의 파일 크기는 9였고
위의 프로그램을 실행한후 파일크기는 26이었습니다.
그리고 그 결과 파일을 vi로 열어보면..
123456789^@^@^@^@^@^@^@^@^@^@^@this..
~
위와 같은 값이 들어갑니다...
원래 있던 내용은 123...9이고 this.. 은 추가된 내용입니다.
중간에 이상한 값이 들어갔구요...
이런경우 상관 없나요??
Forums:
Re: fseek를 사용하여 eof뒤로 밀면?
123456789^@^@^@^@^@^@^@^@^@^@^@this..
VI에서 ^@가 한 글자(1byte)로 나타나는 것은 NULL을 의미합니다.
^A는 0x01이고.. 뭐 이런식으로 표현이 되죠.
원래 크기인 9bytes에서 강제로 20으로 만들었으니.. 11bytes의
NULL이 패딩된 것입니다. 어떤 형태로 코딩을 하시는지는 모르겠지만.
불필요한 11bytes를 패딩시켜가며 파일을 생성하는것 보단
한 바이트정도의 구분자를 주어 사용하는것이 좋을 듯 합니다.
Re: fseek는 퍼일 크기 안쪽에서만 사용하세요
fseek는 퍼일 크기 안쪽에서만 사용하세요.
EOF를 넘어가면 오떤 일이 벌어지는지는
아무도 책임을 지지 않는 것으로 알고 있습니다.
9바이트 파일에서 26바이트 파일로 만들고
싶다면 fwrite를 이용해서 갱신한 후 fseek를
사용하세요.
Re: fseek를 사용하여 eof뒤로 밀면?
참고로, 파일의 맨 끝에서 fseek를 사용하여 사이즈를 증가시키면
님의 경우 처럼 널 문자가 추가가 됩니다. 이 널 문자가 한 블럭
을 이루면 hole이 됩니다.
이 hole은 실제 파일의 내용은 없지만, 블럭을 차지하게 됩니다.
hole를 가진 파일을 cp 명령을 통해 복사하면, hole이 유지가 됩
니다. 즉 불필요한 한 블럭이 복사가 되는 것이지요..
이런 경우엔, hole를 처리해 주면 한 블럭의 낭비를 줄일 수 있겠죠..
그럼 수고하세요
댓글 달기