C++ Применение cin.getline к двумерным массивам char

144
08 января 2022, 05:50

Вопрос таков - какие есть решения?

У меня есть объект, который я хочу целиком записать в файл, для этого у него должны быть все значения определённой длины, в нескольких полях мне нужно использовать двумерный массив char , запись идёт с помощью cin.getline, каждую строку нужно записывать отдельно (то есть не все вместе через пробел), а писать arr[][] в cin.getline нельзя, можно - arr[], но тогда не понятно что выводит и работает некорректно.(По крайней мере так, как я писал)

Answer 1

Оставляю свой ответ здесь, потому что сам ничего не нашёл, вдруг, кому-то это будет полезно, если так, прошу оценить))

int field_size = 256
int number_of_fields = 3
char arr[number_of_fields][field_size]={0};
    for (int i=0;i<number_of_fields;i++){
        cin.getline((char*)&arr+(i*field_size),field_size);
    }
// Test
    for (int i=0;i<number_of_fields;i++){
            for(int j=0;j<field_size;j++){
                    cout <<"["<< i << "]" << " [" << j << "] = ";
                    cout << arr[i][j] << endl;
            }
    }

Что здесь написано? Мы находим начало массива в памяти, затем заполняем первую строку массива, затем, чтобы ввести вторую строку в char[1][0-256] мы шагаем от начала массива на длину первого поля(256) и записываем строку во второе поле.

P.S Решение пришло в голову пока писал сюда этот вопрос, так что спасибо великому Stack Overflow!)))

Answer 2

Многомерные массивы представляются как массивы массивов. Массив T A[n][m] это n массивов из m элементов в каждом, и в С++ в памяти они распологаются рядом_строка за строкой. Поэтому ничего необычного в том, что можно рассматривать его как одномерный массив, а A[i] как имя i _ того массива. Массив А, это просто n * m элементов типа T к которым мы обращаемся, как n массивов по m элементов типа T. Поэтому, в конкретном вашем примере, не нужны никакие преобразования(я бы не назвал это грамотным подходом), а нужно лишь обращаться к началу каждого массива. Начало i_той строки это есть адрес первого элемента этой строки, что можно получить любым из следующих способов:

&A[i][0]   //  адрес первого элемента i_той строки
A[i]       // указатель на i_тую строку

И написать просто:

for (int i = 0; i < number_of_fields; i++) {
    cin.getline(arr[i], field_size);
}
READ ALSO
Почему нет доступа к полям MyIterator?

Почему нет доступа к полям MyIterator?

Я пишу вторую версию вставки в map, где нужно передавать ещё и итератор, помимо вставляемой пары, то есть пишу аналог такой вставки:

195
Башня || Олимпиада ACM-ICPC

Башня || Олимпиада ACM-ICPC

Есть вопрос к задаче по алгоритмическому программированию:

218
(C++) Самоудаление dll возможно?

(C++) Самоудаление dll возможно?

Возможно ли сделать самоудаление dll при возвращении DLL_PROCESS_DETACH?

171
Олимпиадная задача // Путь белки

Олимпиадная задача // Путь белки

у меня возникли некоторые проблемы с одной задачейВот краткое условие:

102