Записывать большие блоки в файл с помощью fwrite() (например, 1000000000)

Я пытаюсь написать блоки с 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--;
            }

2 ответа

Решение

Вы предполагаете, что тип, используемый в вашей библиотеке C для представления размера объектов и индексной памяти (size_t) может содержать тот же диапазон значений, что и uint64_t, Это может быть не так!

fwrite Страница man указывает, что вы можете использовать функцию для записи блоков, размер которых ограничен size_t тип. Если вы работаете в 32-битной системе, значение размера блока передается fwrite будет брошен из uint64_t к любой библиотеке size_t является (uint32_tНапример, в этом случае у очень большого значения будут потеряны наиболее значимые цифры).

У меня был сбой fwrite с блоком>64MB, скомпилированным с gcc 4.1.2 на CentOS 5.3. Мне пришлось разбить его на более мелкие части. У меня также была ошибка fread() для блоков размером более 64 МБ при той же настройке.

Похоже, это было исправлено в более поздних версиях Linux, например, в Ubuntu 12.04.

Другие вопросы по тегам