2GB limit on file size when using fwrite in C?
我有一个简短的C程序,它将写入文件,直到磁盘上没有更多空间为止:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
当我运行该程序(在Linux中)时,文件达到2GB时它将停止。
由于FILE结构或其他原因,是否存在内部限制?
谢谢。
在32位系统(即OS为32位)上,默认情况下,fopen和co限制为32位大小/偏移量等。您需要启用大文件支持,或使用* 64位选项:
http://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
然后,您的fs需要支持此功能,但是fat和其他原始fs除外,它们都支持创建> 2 gb的文件。
it stops when the file reaches 2GB.
Is there an internal limitation, due
to the FILE structure, or something?
这是由于libc(标准C库)引起的,默认情况下,它在x86(IA-32)Linux系统上是glibc(GNU的C库)提供的32位功能。因此,默认情况下文件流大小基于32位-2 ^(32-1)。
有关使用大文件支持的信息,请参见网页。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #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; } |
注意:大多数系统期望fopen(和off_t)基于2 ^ 31文件大小限制。用