2009-04-08 10 views
21

디스크에 더 이상 공간이 없을 때까지 파일에 쓸 짧은 C 프로그램이 있습니다.C에서 fwrite를 사용할 때 파일 크기에 2GB 제한이 있습니까?

#include <stdio.h> 

int main(void) { 
    char c[] = "abcdefghij"; 
    size_t rez; 
    FILE *f = fopen("filldisk.dat", "wb"); 
    while (1) { 
    rez = fwrite(c, 1, sizeof(c), f); 
    if (!rez) break; 
    } 
    fclose(f); 
    return 0; 
} 

프로그램을 실행할 때 (Linux에서) 파일이 2GB에 도달하면 중지됩니다.

FILE 구조 등으로 인해 내부 제한이 있습니까?

고마워.

+2

32 비트 정수의 양수 1/2 소리가 들립니다. –

+0

하드 드라이브는 어떤 파일 시스템으로 포맷 되었습니까? – eduffy

+0

리눅스는 "vfat"라고 말합니다. FAT32라고 생각합니다. 처음에는 (거의) 비어있는 4GB 플래시 드라이브입니다. – Gabriel

답변

12

파일이 2GB에 도달하면 중지합니다.

이 (가) FILE 구조에 내부 제한 사항이 있습니까?

이것은 86에서 기본적으로 (IA-32) 리눅스 시스템의 glibc (GNU의 C 라이브러리)에서 제공하는 32 비트 기능입니다 libc의 (표준 C 라이브러리) 때문이다. 따라서 기본적으로 file stream size은 32 비트 -2^(32-1)을 기반으로합니다.

Large File Support을 사용하는 경우 웹 페이지를 참조하십시오.

#define _FILE_OFFSET_BITS 64 
/* or more commonly add -D_FILE_OFFSET_BITS=64 to CFLAGS */ 

#include <stdio.h> 

int main(void) { 
    char c[] = "abcdefghij"; 
    size_t rez; 
    FILE *f = fopen("filldisk.dat", "wb"); 
    while (1) { 
    rez = fwrite(c, 1, sizeof(c), f); 
    if (rez < sizeof(c)) { break; } 
    } 
    fclose(f); 
    return 0; 
} 

참고 : 대부분의 시스템에서는 2^31 파일 크기 제한을 기반으로 fopen (및 off_t)을 예상합니다. 그것들을 off64_tfopen64으로 바꾸면 이것을 명시 적으로 나타냅니다. 에 따라 사용법에 따라 최선을 다할 수 있습니다.이지만 비표준이므로 일반적으로 권장하지 않습니다.

+3

절대 * 64 기능을 사용하지 마십시오. 항상 모든 프로그램을'-D_FILE_OFFSET_BITS = 64'로 컴파일하십시오. –

+0

* 64 기능은 이식성이 없으며 모든 표준에서 잘 정의되지 않았기 때문에 대부분 합의되었지만 일부 제한된 경우에는 좋을 수있는 요구 사항을 명시 적으로 적용합니다. – mctylr