Я обнаружил, что fwrite терпит неудачу, когда я пытаюсь записать несколько большие данные, как показано в следующем коде.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int size = atoi(argv[1]);
printf("%d\n", size);
FILE* fp = fopen("test", "wb");
char* c = "";
int i = fwrite(c, size, 1, fp);
fclose(fp);
printf("%d\n", i);
return 0;
}
Код скомпилирован в двоичный файл tw
Когда я пытаюсь ./tw 10000
, это работает хорошо. Но когда я пытаюсь что-то вроде ./tw 12000
, это терпит неудачу. (Fwrite () возвращает 0 вместо 1)
В чем причина этого? Каким образом я могу избежать этого?
РЕДАКТИРОВАТЬ: Когда я делаю fwrite (c, 1, size, fp), он возвращает 8192 вместо большего размера, который я даю.
2-е РЕДАКТИРОВАНИЕ: Когда я пишу цикл, который выполняется для размера раз и fwrite(c, 1, 1, fp)
каждый раз, он прекрасно работает.
Кажется, когда size слишком велик (как в первом EDIT), он записывает только около 8192 байтов.
Я предполагаю, что что-то ограничило fwrite
запись до байтов фиксированного размера за раз.
3-е РЕДАКТИРОВАНИЕ: Выше не ясно.
Следующее не выполняется для space - w_result != 0
, когда пространство велико, где пространство определяется мной, а w_result - это объект, написанный полностью.
w_result = 0;
char* empty = malloc(BLOCKSIZE * size(char));
w_result = fwrite(empty, BLOCKSIZE, space, fp);
printf("%d lost\n", space - w_result);
Пока все работает нормально.
w_result = 0;
char* empty = malloc(BLOCKSIZE * sizeof(char));
for(i = 0; i < space; i ++)
w_result += fwrite(empty, BLOCKSIZE, 1, fp);
printf("%d lost\n", space - w_result);
(каждая переменная была объявлена).
Я исправил некоторые ошибки, которые запомнили ответы. Но первый должен работать в соответствии с вами.