Вопрос таков - какие есть решения?
У меня есть объект, который я хочу целиком записать в файл, для этого у него должны быть все значения определённой длины, в нескольких полях мне нужно использовать двумерный массив char , запись идёт с помощью cin.getline
, каждую строку нужно записывать отдельно (то есть не все вместе через пробел), а писать arr[][]
в cin.getline
нельзя, можно - arr[]
, но тогда не понятно что выводит и работает некорректно.(По крайней мере так, как я писал)
Оставляю свой ответ здесь, потому что сам ничего не нашёл, вдруг, кому-то это будет полезно, если так, прошу оценить))
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!)))
Многомерные массивы представляются как массивы массивов. Массив 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);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я пишу вторую версию вставки в map, где нужно передавать ещё и итератор, помимо вставляемой пары, то есть пишу аналог такой вставки:
Возможно ли сделать самоудаление dll при возвращении DLL_PROCESS_DETACH?
у меня возникли некоторые проблемы с одной задачейВот краткое условие: