|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.12.2011, 10:36 | #1 |
***
Участник клуба
Регистрация: 30.07.2007
Сообщений: 1,162
|
Способы считывания строки не известной длины (си)
Что то не могу понять логику работы. Допустим есть файл, из него нужно считать строки и сохранить их для дальнейшей работы. Размер файла и строк не известен. Читаю пару книг, смотрю в интернете, но везде приводят примеры с заранее фиксированном кол-вом символов. Можно но словах, но если не трудно можно не большим примером. Как такое вообще делается.
|
14.12.2011, 11:15 | #2 |
***
Участник клуба
Регистрация: 30.07.2007
Сообщений: 1,162
|
Написал и вроде сам разобрался. Не знаю, может я не правильно что делаю?
Код:
|
14.12.2011, 11:23 | #3 |
Пользователь
Регистрация: 13.11.2011
Сообщений: 24
|
Можно начать считывать файл в первом проходе, подсчитывая количество переносов строк (символы с кодами 10 и/или 13) и количество символов (расстояние) между началом файла / предыдущим переносом строки и очередным переносом строки. Это расстояние будет размером строки. Затем динамически malloc или new выделять память под эти строки для чтения их во втором проходе.
Ну или может как-то ещё средствами C++. realloc - это некрасивое решение. Проще прочитать два раза, я думаю. Последний раз редактировалось Felian; 14.12.2011 в 11:26. |
14.12.2011, 11:29 | #4 | |
***
Участник клуба
Регистрация: 30.07.2007
Сообщений: 1,162
|
Цитата:
|
|
14.12.2011, 17:54 | #5 |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
Подход правильный - читать посимвольныо, пока не встретится конец строки. Только реализация немножко не правильная.
Вместо того, чтобы все время дописывать один символ в вашу строку - создайте большой буфер, и читайте в него, когда нашли символ конца строки, создаете новую строку, размером равную количеству символов в буфере, и переписываете содержимое буфера в нее. Только не забывайте следить, чтобы буфер не переполнился. Если к моменту, когда буфер закончился, символ конца строки еще не прочитан, можно либо с помощью realloc() увеличить буфер, либо переписать содержимое в новую строку, и начать читать в буфер с начала, а потом дописать прочитанное в первую строку, опять же увеличив ее с помощью realloc() (я бы выбрал второй вариант). Читать файл два раза - самое плохое решение, из всех тут рассмотренных
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
15.12.2011, 08:22 | #6 |
***
Участник клуба
Регистрация: 30.07.2007
Сообщений: 1,162
|
Код:
|
15.12.2011, 09:18 | #7 |
Я
Форумчанин
Регистрация: 24.04.2010
Сообщений: 693
|
Код:
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©. |
15.12.2011, 10:07 | #9 |
Старожил
Регистрация: 02.01.2011
Сообщений: 3,327
|
> dr.Chas
Насчёт количества строк понятно (malloc, realloc), но как быть если длина строки слишком большая. Пока не могу придумать. Наверное зависим от задачи. Например, можно переносить символы строки (которые не уместились в текущую), в следующую. Вариант с переносом возможен? // readlines: считывает строки из файла в массив указателей на строки, возвращает количество считанных строк // getline: считывает строку в s из файла, используется в readlines(), возвращает длину строки Я немного переработал пример из K&R: 1. функция getline теперь считывает строку из файла (ранее из терминала). 2. в readline считывает все строки в массив указателей на char, используя malloc() для выделения памяти (ранее alloc) 3. указатель на файл передаю readlines, а потом в getline. По другому не смог придумать, как не передавать. Сделать глобальной pfile не получается. 4. В случае если длина строки слишком большая или количество строк слишком много, то выводится сообщение: "error: input file is too big" Код:
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
вычисление длины строки | fokinamasha | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 3 | 01.04.2011 22:06 |
Вычисление длины строки | Agafon | Microsoft Office Word | 12 | 17.11.2010 15:43 |
измерение длины строки | Agafon | Общие вопросы Delphi | 6 | 11.11.2010 15:13 |
Способы получения ссылки на ячейку при известном номере строки. | Tidus | Microsoft Office Excel | 5 | 08.06.2010 09:33 |
Строки неизвестной длины в си | abr_question | Общие вопросы C/C++ | 18 | 22.01.2010 00:26 |