정확한 파일사이즈가 무엇일까요?
글쓴이: manof / 작성시간: 토, 2009/01/31 - 12:07오전
아래의 코드로 구해진 각각의 파일사이즈만큼
"test.txt"파일을 열고,
fread(파일사이즈)해서, 버퍼에 카피해놓은후에
새로운 "test2.txt"파일을 생성해서
fwrite(파일사이즈)로 쓰고,
메모장에서 열어보면
1번,2번은 파일뒤에 요런 이상한 문자가 "袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴袴"
3번은 원본하고 똑같습니다.
왜 이런일이 생기는 걸까요?
//1. 파일사이즈 FILE* fp = fopen("test.txt","r"); fseek(fp,0,SEEK_END); int nSize = ftell(fp); fclose(fp); //2. 파일사이즈(visual c++) HANDLE hFile = CreateFile(_T("test.txt"), // GENERIC_READ, // open for reading FILE_SHARE_READ, // share for reading NULL, // no security OPEN_ALWAYS, // ALWAYS file only FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr. template if (hFile != INVALID_HANDLE_VALUE) { nSize = ::GetFileSize (hFile, NULL) ; ::CloseHandle(hFile); } //3. 파일사이즈 nSize = 0; fp = fopen("test.txt","r"); while( fgetc(fp) != EOF ) { nSize++; } fclose(fp);
Forums:
C 언어로 작성된
C 언어로 작성된 프로그램에서 newline(새줄문자)과 EOF(파일의 끝)가 처리되는 방식은, 시스템에 따라 다릅니다.
ASCII를 쓰는 시스템으로 한정할 경우, 예를 들어, UNIX 계열 시스템에서 '\n' 문자는 파일에 저장될 때, ASCII LF로 저장됩니다. 반면, DOS/Windows에서 '\n' 문자는 ASCII CR, LF의 두 문자로 저장됩니다. 따라서, binary "b"를 지정하지 않은 상태에서 ftell(3)로 파일의 크기를 알아내는 것은 정확하지 않습니다.
ftell(3)을 쓰는 것이 좋지 않은 이유는 또 한가지... CP/M, DOS등의 파일 시스템은 정확한 파일의 끝을 나타내는 방법이 없기 때문에, 텍스트 파일의 끝을 나타내는 문자로 ^Z를 사용했습니다. (확인해보지 않았지만, Windows에서도 이런 방식을 아직 지원하는 것으로 알고 있음) 따라서, 이 경우에도 ftell()을 쓰면, 정확한 파일의 크기를 알아낼 수 없습니다.
요약해서, 파일의 크기를 정확히 알아내는 방법은 C 표준에서 제공하지 않습니다. 이 방법은 OS에 따라 제공되는 API를 활용해야 하며, UNIX 계열에서는 stat(2), fstat(2) 등을 써서 알아낼 수 있습니다. (이는 POSIX 표준입니다.)
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기