2009-04-08 22 views
21

tôi có một chương trình C ngắn mà viết vào một tập tin cho đến khi không có nhiều không gian trên đĩa:Giới hạn 2GB đối với kích thước tệp khi sử dụng fwrite trong C?

#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; 
} 

Khi tôi chạy chương trình (trong Linux), nó dừng lại khi tập tin đạt 2GB.

Có giới hạn nội bộ, do cấu trúc FILE hay không?

Cảm ơn.

+2

Điều đó nghe giống như số nguyên dương của số nguyên 32 bit. –

+0

Hệ thống tệp nào được định dạng là ổ đĩa cứng của bạn? – eduffy

+0

Linux nói "vfat", là FAT32 mà tôi nghĩ. Nó là một ổ đĩa flash 4GB, ban đầu (gần như) trống. – Gabriel

Trả lời

27

Trên hệ thống 32 bit (tức là hệ điều hành là 32 bit), theo mặc định, fopen và co được giới hạn ở kích thước 32 bit/offset/etc ... Bạn cần bật hỗ trợ tệp lớn hoặc sử dụng * 64 bit tùy chọn:

http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931

Sau đó fs bạn cần hỗ trợ này, nhưng trừ chất béo và fs nguyên thủy khác, tất cả trong số họ hỗ trợ tạo file> 2 gb.

12

nó dừng khi tệp đạt đến 2GB.

Có giới hạn nội bộ, do vào cấu trúc FILE hay không?

Điều này là do libc (thư viện C chuẩn), theo mặc định trên hệ thống Linux x86 (IA-32) là các hàm 32 bit do glibc (Thư viện C của GNU) cung cấp. Vì vậy, theo mặc định, file stream size được dựa trên 32 bit - 2^(32-1).

Để sử dụng Large File Support, hãy xem trang web.

#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; 
} 

Lưu ý: Hầu hết các hệ thống đều mong fopen (và off_t) dựa trên giới hạn kích thước tệp là 2^31. Thay thế chúng bằng off64_tfopen64 làm cho điều này rõ ràng, và tùy thuộc vào cách sử dụng có thể là cách tốt nhất để thực hiện. nhưng không được khuyến nghị nói chung vì chúng không chuẩn.

+3

Không bao giờ sử dụng các chức năng * 64. Luôn biên dịch tất cả các chương trình bằng '-D_FILE_OFFSET_BITS = 64'. –

+0

Chủ yếu được đồng ý, vì các chức năng * 64 không di động và không được xác định rõ trong bất kỳ tiêu chuẩn nào, nhưng chúng làm cho yêu cầu rõ ràng có thể tốt trong một số trường hợp giới hạn. – mctylr

Các vấn đề liên quan