文件大小2GB限制使用C中的fwrite的时候?
-
06-09-2019 - |
题
我有写入到文件中的短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;
}
当我运行程序(在Linux中),它当文件达到2GB停止。
是否有一个内部的限制,由于文件结构,或什么?
感谢。
解决方案
在一个32位系统(即,OS是32位),在默认情况下,的fopen和共同被限制为32位大小/偏移/等...您需要启用大文件支持,或使用* 64位选项:
的http:// WWW。 gnu.org/software/libc/manual/html_node/Opening-Streams.html#index-fopen64-931
那么你的FS需要支持这一点,但除了脂肪和其他原始FS,所有的人都支持创建文件> 2 GB。
其他提示
当文件达到2GB其停止。
是否有一个内部的限制,因 到文件结构中,或什么?
这是由于libc的(标准C库),默认情况下在86(IA-32)的Linux系统是由glibc的(GNU的C库)提供32位的功能。所以默认情况下,文件流的大小是基于32位 - 2 ^(32-1)
有关使用大文件支持,看到网页。
#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文件大小限制。与off64_t
和fopen64
更换他们使这个明确的,和使用情况而定可能是去最好的方式。但一般不建议使用,因为它们是非标准的。
不隶属于 StackOverflow