为什么我的程序不能为文件节省大量(> 2GB)?

我无法弄清楚为什么我的程序无法将超过2GB的数据保存到文件中。 我不知道这是编程还是环境(OS)问题。 这是我的源代码:

#define _LARGEFILE_SOURCE #define _LARGEFILE64_SOURCE #define _FILE_OFFSET_BITS 64 #include  #include  #include  #include  #include  #include  /*-------------------------------------*/ //for file mapping in Linux #include #include #include #include #include #include /*-------------------------------------*/ #define PERMS 0600 #define NEW(type) (type *) malloc(sizeof(type)) #define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) void write_result(char *filename, char *data, long long length){ int fd, fq; fd = open(filename, O_RDWR|O_CREAT|O_LARGEFILE, 0644); if (fd < 0) { perror(filename); return -1; } if (ftruncate(fd, length) %lld\n",strlen(ttt)); // length=0 memset (ttt,1,offset); printf("length->%lld\n",strlen(ttt)); // length=3GB write_result("test.big",ttt,offset); return 1; } 

根据我的测试,程序可以生成大于2GB的文件,并且也可以分配如此大的内存。 当我试图将数据写入文件时,发生了奇怪的事情。 我检查了文件,它是空的,应该填充1。

任何人都可以善待并帮助我吗?

您需要阅读更多有关C字符串以及malloccalloc

在你的原始main ttt指向malloc被调用时malloc中的垃圾。 这意味着nul终结符(C String的结束标记,即二进制0)可以是malloc返回的垃圾中的任何位置。

此外,由于malloc不会触及已分配内存的每个字节(并且您要求很多),因此您可能会获得稀疏内存,这意味着在读取或写入内存之前,内存实际上并不可用。

calloc用0分配并填充分配的内存。由于这个原因,它更容易失败(它触及分配的每个字节,因此如果操作系统离开分配稀疏,则在calloc填充之后它将不会稀疏。)

这是您的代码,修复了上述问题。 您还应始终检查write的返回值并做出相应的反应。 我会留给你的……

主要()
 {
     long long offset = 3000000000;  // 3GB
     char * ttt;
     // ttt =(char *)malloc(sizeof(char)* offset);
     ttt =(char *)calloc(sizeof(char),offset);  //而不是malloc(...)
     if(!ttt)
     {
         put(“calloc失败,再见!”);
        出口(87);
     }

    的printf( “长度 - >%LLD \ n” 个,strlen的(TTT));  // length = 0(如果calloc没有失败,这现在可以正常工作)
     memset(ttt,1,offset);
     ttt [offset  -  1] = 0;  //现在它已经终止并且下面的printf将起作用
    的printf( “长度 - >%LLD \ n” 个,strlen的(TTT));  //长度= 3GB
     write_result( “test.big”,TTT,偏移量);
    返回1;
 }

Linux大师的注意事项……我知道稀疏可能不是正确的术语。 如果我错了,请纠正我,因为我被埋在Linux细节中已经有一段时间了。 🙂

看起来你正在达到iDevice的内部文件系统限制: ios – 企业应用程序,其资源文件大小超过2GB

2Gb +文件根本不可能。 如果需要存储大量数据,则应考虑使用其他一些工具或编写文件块管理器。

我打算在这里说出你的问题可能在于memset()。

我认为,最好的办法是在memset()之后,

 for (unsigned long i = 0; i < 3000000000; i++) { if (ttt[i] != 1) { printf("error in data at location %d", i); break; } } 

一旦您确认您尝试编写的数据是正确的,那么您应该考虑编写一个较小的文件,例如1GB,看看是否有相同的问题。 消除每个可能的变量,你会找到答案。