запись 2d массивов в выходные файлы - c ++ - PullRequest
0 голосов
/ 10 декабря 2008

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 10 декабря 2008

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

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

0 голосов
/ 12 декабря 2008

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

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

Там есть тонкие различия между указателем int * и 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 буферизуются, и вы все равно связаны диском io ...

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

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

...