запись 2d массивов в выходные файлы - c ++

Я пытаюсь записать 2d массив в выходной файл, все работает нормально, за исключением создания функции .getline, чтобы вытащить массив обратно из файла. Моя проблема заключается в установке длины строки. Мой текущий код для строки:

inputFile.getline (myArray, [10] [10], '\ n');

но это не нравится иметь длину строки в квадратных скобках, кажется, что мне делать?

заранее спасибо

10.12.2008 20:25:40
Нам определенно понадобится больше информации. Функция getline читает символы из файла, поэтому указанная вами запись массива не имеет особого смысла. Как подсказывает tfinniga, нам нужно сначала увидеть код, который вы используете для записи массива в файл.
e.James 10.12.2008 20:36:00
2 ОТВЕТА
РЕШЕНИЕ

Для того, чтобы компилировать, myArrayдолжен быть массив charили char*. В частности, это одномерный массив. Чтобы прочитать несколько измерений, вам нужно прочитать каждую строку отдельно. Второй параметр std::istream::getline- это максимальное количество chars для чтения и сохранения в массиве, минус один.

Чтобы начать читать что-то из файла, вы должны сначала узнать, как файл был записан. Вы знаете , как файл был создан, я надеюсь, но вы не описали , что в вашем вопросе. Знание того, как был написан файл, необходимо знать, как читать из него. Покажите код, пожалуйста.

2
27.08.2013 14:43:19

При всем уважении к Робу Кеннеди , он искажает представление о том, как C / C ++ обрабатывает многомерные массивы.

Рассмотрим int foo [10] [10] и int foo [100]. В обоих случаях foo является указателем на блок памяти, содержащий sizeof (int) * 100 байт.

Там являются тонкие различия между междунар * указатель и INT Foo [10] [10]. Особенно в отношении sizeof () и определенной проверки ошибок конкретного компилятора. Но при желании мы можем обращаться с ними взаимозаменяемо.


Тем не менее, leachrode не может передать аргумент 2 getline () как "[10] [10]" . Он может передать «10 * 10 * sizeof (foo)» , где foo - это тип myArray . Он также может передать sizeof (myArray) , если он фактически объявлен как массив.

Переменная myArray НЕ обязательно должна иметь тип char . Однако ни один из байтов в блоке данных myArray не может иметь значение '\ n', если этот вызов getline () будет работать.

Лично я бы пошел с бинарным хранилищем. Например: (Предполагая, что inputFile является объектом iostream.)

 inputFile.write( (const char *)myArray, sizeof(myArray) );
 inputFile.read( (char *)myArray, sizeof(myArray) );

* ОДНАКО * , это предполагает, что вы читаете и пишете в бинарно-совместимых системах. Мы делаем предположения о том, как ваш компилятор хранит этот массив в памяти. Разные компиляторы могут делать разные вещи. Проблемы с отступами и выравниванием могут создавать кросс-платформенные кошмары.

Было бы лучше, с точки зрения переносимости и будущего обслуживания, читать / записывать каждый элемент массива по отдельности! В коде это не намного сложнее. По скорости, iostreams буферизуются, и вы все равно связаны диском ...

Ссылка: http://www.cplusplus.com/reference/iostream/

Запоздалая мысль: - ЕСЛИ myArray не элементарного типа (int [], double []), а вместо этого представляет массив объектов (с виртуальными членами) или указателей, вам понадобятся средства сериализации. Указатели не будут указывать на действительную память, когда они считываются обратно.

0
11.12.2008 23:09:27