Записывать большие блоки в файл с помощью 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.