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

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

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

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

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


person user33061    schedule 10.12.2008    source источник
comment
Нам определенно понадобится больше информации. Функция getline считывает символы из файла, поэтому указанная вами запись массива не имеет особого смысла. Как предполагает tfinniga, в первую очередь нам нужно увидеть код, который вы используете для записи массива в файл.   -  person e.James    schedule 10.12.2008


Ответы (2)


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

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

person Rob Kennedy    schedule 10.12.2008

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

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

Между int *pointer и 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) );

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

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

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

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

person Mr.Ree    schedule 11.12.2008