| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Как правильно использовать fgets? |
| Автор: AxNe0 11.5.2006, 13:20 |
| Как можно прочесть первую строку открытого с помощью fopen файла? |
| Автор: Romikgy 11.5.2006, 13:42 | ||
|
| Автор: AxNe0 11.5.2006, 15:14 |
| Romikgy, а если заранее длина строки неизвестна? |
| Автор: likehood 11.5.2006, 15:42 |
| Вторым параметром fgets задается максимальный размер строки, т.е. длина массива string. Эта длина должна быть заведомо больше самой длинной строки в файле. |
| Автор: gepard 11.5.2006, 16:02 |
| Значит её сначала надо посчитать Считываешь по байтам, когда встречаешь конец строки - обрываешь увелечение счётчика и получаешь длинну. |
| Автор: bsa 11.5.2006, 17:10 | ||
Таким образом, если в конце прочитанной строки отсутствует символ конца строки ('\n'), то это говорит: а) строка в файле длиннее, чем выделенный под нее буфер б) достигнут конец файла (это условие можно проверить с помощью feof(stream) ) Поэтому, чтобы прочитать строку любой длины из файла, надо: 1. выделить буфер s размером n=N знаков: s = (char*)malloc( n ); 2. объявить переменную переменной int d = 0; 3. прочитать в s + d не более (n-d) символов 4. d += strlen(s); 5. ecли feof(fd) != 0, то переход на п. 7 6. если s[ d - 1] != '\n' 6.1. n += N; 6.2. увеличить объем буфера: s = (char*)realloc( s, n ) 6.3. перейти на п. 3 7. если feof(fd) != 0, то d = 0 8. переход на п. 3 9. конец. В пункте 7 имеем полностью прочитанную строку. Все, кроме последней быть может, будут заканчиваться на символ конца строки '\n'. |
| Автор: nworm 11.5.2006, 17:42 |
| Если пошли такие проблемы, то можно просто писать свою функцию (чтобы от длины строки не зависела). А за основу взять код функции fgets из стандартной библиотеки. |
| Автор: AxNe0 11.5.2006, 21:59 | ||
Написал:
Не работает. Почему? |
| Автор: Dithur 11.5.2006, 22:30 | ||
Функция подсчёта длины списка, думаю можно идею использовать для подсчёта длины первой строки файла, если чуть-чуть подправить:
Честно признаюсь код сдул месяц назад с кого-то задачника, по-моему с Тарасова, может пригодится |
| Автор: Romikgy 12.5.2006, 09:00 |
| AxNe0, если неизвестно , тогда счтитывай по символьно , до перевода строки |
| Автор: AxNe0 12.5.2006, 11:08 |
| Кто-нибудь знает, где можно найти более-менее понятное описание функций из <string.h>? До использовал ObjectPascal, а тут функции немного по-другому называются... |
| Автор: bsa 12.5.2006, 11:20 | ||||
Добавлено @ 11:25
http://www.google.com/search?hs=en7&hl=ru&rls=ru&q=string.h&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr= |
| Автор: AxNe0 12.5.2006, 23:39 | ||
Всем спасибо! Учел.
Результат функции должен отображаться на CStatic, но отображается вместо латинских букв такая штука: Как можно поправить ситуацию? |
| Автор: Romikgy 13.5.2006, 08:51 |
покажи код вывода в цстатик? |
| Автор: AxNe0 13.5.2006, 16:04 | ||
Вот весь код, относящийся к CStatic
|
| Автор: AxNe0 15.5.2006, 00:46 | ||||
Отбой тревоги!
на
соответственно. |
| Автор: Kosya4ok 18.12.2007, 19:07 | ||
| я так понимаю что char * fgets ( char * str, int num, FILE * stream ) второй аргумент отвечает за число симовлом которые будут прочитаны и записаны в char *str? Если так то странно получается. Создал файл 1345f;dfjag 2sdhsg 3sgh и говорю
так мне почему то все равно выводит все символы записанные в фале. Как ограничить тогда колиство выводимы символов? |
| Автор: nworm 18.12.2007, 23:46 | ||||
Ну. не знаю. Может
убрать? |