При всем уважении к Робу Кеннеди, он неверно представляет, как 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