Я пытаюсь использовать двоичный файл для хранения своих данных. Но я не понимаю, как мне читать/писать в форме 2D-массива. Я знаю, как читать массивы/структуры и т. д. из двоичных файлов, я просто не знаю, как это сделать с 2D-массивом.
Я просмотрел подобные вопросы, но я не понял, к чему приходит большинство людей. Я просто хочу знать, как читать/записывать данные в формате 2D-массива. как в fwrite(x, y, z, w); .
Вот как выглядит мой массив:
int array[50][100];
Я не знаю, что делать с этого момента, если бы это было одномерным, я бы сделал;
FILE* fp;
fp = fopen("file.bin","wb+");
fwrite(array, sizeof(int), 50, fp);
но поскольку этот массив многомерный, я на самом деле не знаю, что вставить в эту функцию.
Заранее спасибо.
Обратите внимание, что я новичок в кодировании и, возможно, не вижу довольно простого решения.
Да, а нельзя ли целиком прочитать? Я имею в виду, что вы можете читать массивы целиком, верно?
Если вы можете быть уверены, что он будет читать и писать по одному и тому же шаблону, конечно.
Да, но как? сделать ``` fwrite(array,sizeof(int),50*100,fp); ```
Что произошло, когда вы попробовали это?
При записи информации в двоичной форме вам нужна некоторая схема, чтобы указать, сколько данных записывается и в какой форме они включаются в то, что записывается в файл. Если в файл необходимо записать более одного массива, то примером может быть Приставка ваших данных с 9-байтами, представляющими char int int
, где вы храните размер типа (например, char
будет содержать 4
для sizeof(int)
,), а затем следующие два int
будет содержать rows
и cols
для размеров массива (для одномерного массива rows=1
). Затем вы можете просто прочитать 9 байтов и узнать, что будет дальше.
Метод сохранения двумерного массива будет очень похож на сохранение одномерного массива, это действительно так, как вы написали в комментарии к вопросу:
fwrite(array, sizeof(int), 50*100, fp);
Это связано с тем, что двумерный (в данном случае int
) массив хранится так же, как и одномерный массив; неразрывная цепочка int
s. Тем не менее, вы можете сохранить его любым способом, если вы придерживаетесь режима сохранения/загрузки. fwrite
принимает указатель в качестве аргумента, поэтому, пока данные, которые вы ему передаете, представляют собой массив, он будет работать.
@MarkBenningfield К сожалению, я написал, что fwrite принимает массив в качестве аргумента, когда он имеет тип void *. Я смешал свое объяснение с терминологией, отредактировав сообщение соответствующим образом.
Вы мне очень помогли! Спасибо :)
Если вы читаете/записываете каждый элемент по одному, вам просто нужно обязательно читать и писать по одному и тому же шаблону.