Автор | Сообщение |
|
| |
Пост N: 70
Зарегистрирован: 15.12.06
|
|
Отправлено: 03.07.07 13:33. Заголовок: Чтение строк из файла
Вот такой, вроде как простой, вопрос, но ответа не нашёл. Есть ли в Клиппере или Харборе функция, которая читает строки (по одной) из файла? (Строки - куски текста, заканчивающиеся CRLF или LF). Где-то я встречал утверждение, что не надо делать свою буферизацию, на самом деле - надо. Если читать из файла побайтно, получается страшно долго. Я в своё время написал функцию, которая читает с буферизацией, но почему-то работает всё равно медленно:при маленьких файлах незаметно, при больших - читает намного медленнее, чем dbf такого же размера (это можно понять, записи одинаковой длины), но - в этом же самом файле любой редактор ищет намного быстрее. Есть ли что-нибудь стандартное? Кто знает? Ведь задача-то типичная.
|
|
|
Ответов - 36
, стр:
1
2
All
[только новые]
|
|
|
| |
Пост N: 2
Зарегистрирован: 09.11.06
|
|
Отправлено: 05.07.07 13:36. Заголовок: fgerger
ewferg
|
|
|
|
| |
Пост N: 77
Зарегистрирован: 15.12.06
|
|
Отправлено: 06.07.07 14:05. Заголовок: Re:
Спасибо всем за помощь! Dima Понравился набор функций hb_f*(), пригодится не только hb_freadln(), но и другие. Но одно плохо: как разделитель понимает только CRLF, а просто LF - нет. А такие файлы бывают.
|
|
|
|
| постоянный участник
|
Пост N: 182
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.07.07 14:52. Заголовок: Re:
AM пишет: цитата: | Но одно плохо: как разделитель понимает только CRLF, а просто LF - нет. |
| CRLF или LFCR Но ведь мы имеем дело с открытым кодом, поменял конструкции типа if ( ((*(b + x) == 13) && (*(b + x + 1) == 10)) || ((*(b + x) == 10) && (*(b + x + 1) == 13)) || (*(b + x) == 26) || ( x >= (int)read) ) на if ( ((*(b + x) == 10 ) || (*(b + x) == 26) || ( x >= (int) read) ) или что-нибудь в этом роде и опять радуешься жизни
|
|
|
|
| |
Пост N: 78
Зарегистрирован: 15.12.06
|
|
Отправлено: 06.07.07 16:22. Заголовок: Re:
А где взять? Сама библиотека есть, исходников нет. Поискал - не нашёл.
|
|
|
|
| |
Пост N: 736
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.07.07 16:57. Заголовок: Re:
AM пишет: цитата: | А где взять? Сама библиотека есть, исходников нет. |
| у меня тут лежит C:\CVS\xharbour\source\misc\hb_f.c
|
|
|
|
| |
Пост N: 79
Зарегистрирован: 15.12.06
|
|
Отправлено: 06.07.07 17:20. Заголовок: Re:
Да, нашёл. Сначала файл (он завалялся в другом месте). А до этого не нашёл, т.к. искал только где положено. Спасибо.
|
|
|
|
| |
Пост N: 1
Зарегистрирован: 10.07.07
|
|
Отправлено: 10.07.07 12:43. Заголовок: Re:
AM пишет: цитата: | Вот такой, вроде как простой, вопрос, но ответа не нашёл. Есть ли в Клиппере или Харборе функция, которая читает строки (по одной) из файла? |
| а в чем проблема - 10 строк написать? AM пишет: цитата: | Если читать из файла побайтно |
| попробуй читать по 2 байта зараз. Будет в 2 раза быстрей Dima!!! задолбал меня форум, постоянно на пароль ругается!!!! то он с ником совпадает, то не подходит!!!!! Уже седьмой ник завел! Удали пользователя suv.... suv6 я зарегистрирую снова suv
|
|
|
|
| |
Пост N: 80
Зарегистрирован: 15.12.06
|
|
Отправлено: 10.07.07 13:29. Заголовок: Re:
suv7 Да уже всё, проехали. Петр Нет, малость посложней получилось if ( ((*(b + x) == 13) && (*(b + x + 1) == 10)) || (*(b + x) == 26) || ( x >= (int)read) ) break; else if (*(b + x) == 10) { if ( (*(b + x+1) != 13) && (x>0) ) x--; break; } А если в конце chr(13)+chr(10)+chr(26), то напоследок выдаёт пустую строку. Может, так и д.б., это не очень важно.
|
|
|
|
| |
Пост N: 2
Зарегистрирован: 31.03.07
|
|
Отправлено: 12.07.07 09:51. Заголовок: Re:
Много лет назад я написал целую библиотеку функций которые использовали текстовый файл как массив. На сколько я помню в основе лежали готовые функции из библиотеки CTools-3 (кажется так называлась) Сейчас пытаюсь перевеси свои программы на xHarbour, но к сожалению не смотря на поддержку этой библиотеки функции не работают. По всей видимости поддержка CTools не полная.
|
|
|
|
| постоянный участник
|
Пост N: 183
Зарегистрирован: 09.10.06
|
|
Отправлено: 12.07.07 11:59. Заголовок: Re:
Uncle_ed пишет: цитата: | Петр Нет, малость посложней получилось |
| Я же писал что-нибудь в этом роде. В оригинале (см. выше) функция обрабатывает CRLF и LFCR if ( ((*(b + x) == 13) && (*(b + x + 1) == 10)) || ((*(b + x) == 10) && (*(b + x + 1) == 13)) || (*(b + x) == 26) || ( x >= (int)read) ) { break; Если тебе просто надо обработать еще LF, т.е. можно просто добавить ИЛИ LF if ( ((*(b + x) == 13) && (*(b + x + 1) == 10)) || ((*(b + x) == 10) && (*(b + x + 1) == 13)) || (*(b + x) == 10)) || (*(b + x) == 26) || ( x >= (int)read) ) { break; Если ты не хочешь обрабатывать LFCR выбрось ((*(b + x) == 10) && (*(b + x + 1) == 13)) Определись какие разделители ты хочешь использовать. Если только CRLF и LF, то зачем делать лишнюю проверку if ( (*(b + x+1) != 13) ? И какой смысл ты вкладываешь в x-- ?
|
|
|
|
| |
Пост N: 82
Зарегистрирован: 15.12.06
|
|
Отправлено: 12.07.07 13:28. Заголовок: Re:
Петр пишет: цитата: | ((*(b + x) == 10) && (*(b + x + 1) == 13)) || (*(b + x) == 10)) |
| Так получается тавтология. Лучше просто убрать && (*(b + x + 1) == 13)) На самом деле на практике у меня встречаются файлы с CRLF и с LF. И, естественно, надо, чтобы работало и с тем и с другим без подсказок человека. LFCR пока не было, но кто знает? Твой пример (только разобраться со скобками) правильно работает вроде бы на всех комбинациях! Но только если в функции hb_hbfskip() исправлено по-моему. Т.е. надо проверить, лишние действия и правда могут быть.
|
|
|
|
|
| |
Пост N: 83
Зарегистрирован: 15.12.06
|
|
Отправлено: 12.07.07 15:16. Заголовок: Re:
Я не совсем по-русски изложил свои мысли. Для правильной работы я изменил hb_hbfskip(), и для однообразия так же изменил и hb_freadln(), и прочие. Но, видимо, эти лишнее, хотя и работает. Вообще-то методом тыка, глубоко я не копал. А есть же ещё hb_ReadAndSkip(), можно будет попробовать.
|
|
|
|
| постоянный участник
|
Пост N: 184
Зарегистрирован: 09.10.06
|
|
Отправлено: 13.07.07 08:34. Заголовок: Re:
AM пишет: цитата: | Так получается тавтология. |
| Где ты ее увидел? Это нормальный код, который работает с CRLF, LFCR и LF. Изменения в других функциях (той же hb_fskip() ) нужны, причем обязательно. Для увеличения быстроты можно еще поиграться с #define b_size 4096 #define c_size 4096
|
|
|
|
| |
Пост N: 84
Зарегистрирован: 15.12.06
|
|
Отправлено: 13.07.07 09:44. Заголовок: Re:
Петр пишет: Ну как же, вспомни булеву алгебру: x | x&y = x (потому что x= x&y | x&^y)
|
|
|
|
| |
Пост N: 118
Зарегистрирован: 15.12.06
|
|
Отправлено: 16.11.11 16:33. Заголовок: Приходится поднимать..
Приходится поднимать старую тему. В новых версиях MiniGui нет исходников hbmisc.lib ? Дело в том, что её функции (hb_fReadLn) так и не работают с только LF в качестве конца строки. А файлы такие продолжают встречаться. Если же вставить отдельные функции в программу (в .prg или .c), в доработанном виде (как выше в теме, и как ранее работало - т.е. по большому счёту, как было в misc.lib), то происходит вылет (спрашивает, сообщать в MS об ошибке или нет). Можно где-то увидеть новые исходники, чтобы понять, как надо ещё доработать? P.S. Хотя, наверно, надо новую тему, в раздел GUI. Прошу модераторов перенести, если возможно.
|
|
|
|
| |
Пост N: 2196
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.11.11 17:16. Заголовок: AM пишет: В новых в..
AM пишет: цитата: | В новых версиях MiniGui нет исходников hbmisc.lib |
| Не там исходники ищешь , смотри сырцы (x)Harbour
|
|
|
Ответов - 36
, стр:
1
2
All
[только новые]
|
|