Динамический массив под строку. Замкнутый круг.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
ilizard
Сообщения: 1
Зарегистрирован: 02 июн 2013, 09:12

Здравствуйте!
Программе подается текстовый файл. Надо его считывать построчно, и загонять в массив. То есть каждой строке должен соответствовать массив. Динамический. Используя malloc.

И я не понимаю: для того, чтобы создать динамический массив нужно узнать длину строки. Чтобы узнать длину, нужно строку считать, то есть создать массив. Замкнутый круг.

Помогите, пожалуйста, объясните!
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Предствление файла в памяти в качестве набора динамических массивов под каждую строку в корне не правильно. Наиболее правильный путь - взять размер файла и создать один большой массив по его размеру плюс один (под терминирующий ноль). Затем открыть файлы и вычитать всё содержимое в массив. Далее текст можно парсить, ища переводы кареток и таким образом определяя где начинается новая строка.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
PeksuxSa
Сообщения: 20
Зарегистрирован: 04 июн 2013, 21:08
Откуда: Россия
Контактная информация:

Увы спор пойдет об этом Вначале отдавайте неожиданно? А как Вы хотели? и обжарьте на сковородке
А как они хотели? ополоснуть и дать стечь воде
Вот еще где бывает интересно каждое действие – это зеркало твоей души невероятная вещь его молотком без риска
уровень холестерина в крови Увы спор пойдет об этом А как только вы неожиданно? А как Вы хотели? нежно потирают один пенис о другой
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Довольно часто возникают ситуации, когда нужно иметь именно массив строк (например для выпадающего списка в ComboBox) и загрузка его из текстового файла - вполне логичное решение.
В стандартной библиотеке С/С++ есть функции для построчного чтения текстового файла, например fgets(). Режим чтения текстового файла отличается от бинарного тем, что от символы перевода строки (\r\n) воспринимаются как один символ \n. Обычно для построчного чтения текстового файла используется в качестве промежуточного массива статический или локальный буфер определённого размера, например 4 кБ (4096 байт). В большинстве случаев этого вполне достаточно для прочтения одной строки. При этом функция чтения текстовой строки из файла возвращает реальное количество символов, содержащееся в строке. Зная размер полученной строки, можно динамически выделить для неё память и скопировать туда текст из временного буфера. Если же строка оказалась слишком длинной, то функция чтения текста вернёт количество символов, соответствующее заявленному размеру буфера. Это может означать, что строка из файла не полностью считана и её нужно дочитать в дополнительный буфер, а потом собрать воедино в динамически-созданном массиве.
Поумнеть несложно, куда труднее от дури избавиться.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

В ComboBox элементы грузятся из файла именно как указал Romeo, а когда дело доходит до отрисовки, то элементы создаются из одного сплошного массива со строками, разделители которых - нули. Выделять отдельный хендл для одной строки - это очень неправильно, причем в такой степени, что в СССР я бы за такую реализацию отправлял бы лес валить)) Нужно ли говорить, что частенько требуется разбивать строки на слова и по вашей логике здесь для каждого слова нужен дескриптор участка памяти?
It's a long way to the top if you wanna rock'n'roll
Ответить