정확한 파일사이즈가 무엇일까요?

manof의 이미지

아래의 코드로 구해진 각각의 파일사이즈만큼

"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);

cinsk의 이미지

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/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.