1

我正在尝试用fwrite(). 在这一点上,我可以写的最大块是 100000000(它可能比那个高一点......我没有尝试......)。我无法写入大小为 1000000000 的块,输出文件为 0 字节。

是否有可能编写例如 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--;
            }
4

2 回答 2

4

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

fwrite手册页表明您可以使用该函数编写大小受size_t类型限制的块。如果您使用的是 32 位系统,则传递给的块大小值fwrite将被uint64_t转换为库的任何size_t值(uint32_t例如,在这种情况下,非常大的值将丢失其最高有效位)。

于 2013-08-13T16:22:36.680 回答
0

我在 CentOS 5.3 上使用 gcc 4.1.2 编译的块 >64MB 导致 fwrite 失败,我不得不将它切成小块。在相同的设置中,我的 fread() 也因大于 64MB 的块而失败。

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

于 2013-11-18T17:58:28.717 回答