@lilyayrn

Как записать в переменную типа char строку неизвестной длины из файла?

В файле записано несколько строк неизвестной длины, разделённые переходом на след строку. Нужно в двумерный массив char записать эти строки. Проблема ещё в том, что количество строк тоже неизвестно. Вообще не могу сообразить, как реализовать данную концепцию.
  • Вопрос задан
  • 472 просмотра
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
C++
Нужно в двумерный массив char записать эти строки

Если это С++, то строки -- это std::string, массив -- это std::vector, используй std::getline и например std::vector::push_back.
Если это массив char, то это C и выделение памяти по мере надобности функцией realloc.
Ответ написан
Adamos
@Adamos
Ну, если без STL и "двумерный массив char" - это char**, то так:
- определяешь размер файла
- выделяешь соответствующее количество памяти char*
- считываешь файл в эту память целиком
- создаешь заведомо достаточный массив unsigned int (или long, смотря что там с размерами файла)
- проходя по этой памяти, записываешь в этот массив позиции символа перевода строки, вместо них вписываешь \0
- создаешь массив char** того размера, сколько получилось переводов строк + 1
- заполняешь его адресной арифметикой по тому самому массиву позиций переводов строк
И никаких realloc :)
Ответ написан
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
С char проблема в том, что вам надо выделить под него память.

Можно, например, выделить массив с запасом - если вы знаете, что строк будет не более 100 размером не более 100 символов, то можно завести массив 100x100:
char names[100][100].
Читать туда можно хоть посимвольно, хоть через getline_s, хоть scanf (не забудьте только прописать в спецификаторе формата размер буфера, чтобы оно не переполнило массив).

Второй вариант - это руками реализовывать фактически vector. Вам надо выделить память под массив какой-то длины, допустим 10. Если же вы уже прочитали 10 символов и надо что-то еще читать, то вам надо память перевыделить через realloc размера, скажем, в 2 раза больше.

Также надо выделять и память под массив со строками char*. Если у вас 10 указателей, а файл еще не кончился и вы будете читать 11-ую строку, то перевыделите память на больше указателей.

Ну лучше всего, конечно, использовать std::string и std::vector.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы