用fwrite()写大块文件(例如1000000000)

时间:2013-08-13 15:48:36

标签: c fwrite

我正在尝试使用fwrite()编写块。在这一点上,我能写的最大的块是100000000(它可能比那个高一点......我没试过......)。我不能写一个大小为1000000000的块,outputfile是0 Byte。

是否有可能编写像例如1000000000甚至更多?

我正在使用uint64_t存储这些数字。

提前谢谢!

评论中来自pastebin的代码:-zw

      char * pEnd;
        uint64_t uintBlockSize=strtoull(chBlockSize, &pEnd, 10);
        uint64_t uintBlockCount=strtoull(chBlockCount, &pEnd, 10);

        char * content=(char *) malloc(uintBlockSize*uintBlockCount);





        /*
        Create vfs.structure
        */
        FILE *storeFile;
        storeFile = fopen (chStoreFile, "w");
        if (storeFile!=NULL)
        {
            uint64_t i=uintBlockCount;

            size_t check;

            /*
                Fill storeFile with empty Blocks
            */
            while (i!=0)
            {
                fwrite(content,uintBlockSize, 1, storeFile);
                i--;
            }

2 个答案:

答案 0 :(得分:4)

您假设C库中用于表示对象大小和索引内存(size_t)的类型可以包含与uint64_t相同的值范围。情况可能并非如此!

fwrite的{​​{3}}表示您可以使用该函数来编写大小受size_t类型限制的块。如果您使用的是32位系统,则传递给fwrite的块大小值将从uint64_t转换为库的size_tuint32_t),例如,在哪种情况下,一个非常大的值会丢失其最重要的数字。

答案 1 :(得分:0)

我在CentOS 5.3上使用gcc 4.1.2编译了一个块> 64MB的fwrite失败了 我不得不把它切成小块。 我也在相同的设置上对> 64MB块进行了fread()失败。

这似乎已在以后的Linux环境中得到修复,例如: Ubuntu 12.04。