On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение



Пост N: 70
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 03.07.07 13:33. Заголовок: Чтение строк из файла


Вот такой, вроде как простой, вопрос, но ответа не нашёл. Есть ли в Клиппере или Харборе функция, которая читает строки (по одной) из файла? (Строки - куски текста, заканчивающиеся CRLF или LF). Где-то я встречал утверждение, что не надо делать свою буферизацию, на самом деле - надо. Если читать из файла побайтно, получается страшно долго. Я в своё время написал функцию, которая читает с буферизацией, но почему-то работает всё равно медленно:при маленьких файлах незаметно, при больших - читает намного медленнее, чем dbf такого же размера (это можно понять, записи одинаковой длины), но - в этом же самом файле любой редактор ищет намного быстрее. Есть ли что-нибудь стандартное? Кто знает? Ведь задача-то типичная.


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 36 , стр: 1 2 All [только новые]





Пост N: 2
Зарегистрирован: 09.11.06
ссылка на сообщение  Отправлено: 05.07.07 13:36. Заголовок: fgerger


ewferg

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 77
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 06.07.07 14:05. Заголовок: Re:


Спасибо всем за помощь!

Dima
Понравился набор функций hb_f*(), пригодится не только hb_freadln(), но и другие. Но одно плохо: как разделитель понимает только CRLF, а просто LF - нет. А такие файлы бывают.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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) )
или что-нибудь в этом роде и опять радуешься жизни




Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 78
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 06.07.07 16:22. Заголовок: Re:


А где взять? Сама библиотека есть, исходников нет. Поискал - не нашёл.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 736
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.07.07 16:57. Заголовок: Re:


AM пишет:

 цитата:
А где взять? Сама библиотека есть, исходников нет.


у меня тут лежит
C:\CVS\xharbour\source\misc\hb_f.c

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 79
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 06.07.07 17:20. Заголовок: Re:


Да, нашёл. Сначала файл (он завалялся в другом месте). А до этого не нашёл, т.к. искал только где положено.
Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1
Зарегистрирован: 10.07.07
ссылка на сообщение  Отправлено: 10.07.07 12:43. Заголовок: Re:


AM пишет:

 цитата:
Вот такой, вроде как простой, вопрос, но ответа не нашёл. Есть ли в Клиппере или Харборе функция, которая читает строки (по одной) из файла?



а в чем проблема - 10 строк написать?

AM пишет:


 цитата:
Если читать из файла побайтно



попробуй читать по 2 байта зараз. Будет в 2 раза быстрей

Dima!!! задолбал меня форум, постоянно на пароль ругается!!!! то он с ником совпадает, то не подходит!!!!! Уже седьмой ник завел! Удали пользователя suv.... suv6 я зарегистрирую снова suv

Спасибо: 0 
ПрофильЦитата Ответить



Пост 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), то напоследок выдаёт пустую строку. Может, так и д.б., это не очень важно.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2
Зарегистрирован: 31.03.07
ссылка на сообщение  Отправлено: 12.07.07 09:51. Заголовок: Re:


Много лет назад я написал целую библиотеку функций которые использовали текстовый файл как массив. На сколько я помню в основе лежали готовые функции из библиотеки CTools-3 (кажется так называлась)
Сейчас пытаюсь перевеси свои программы на xHarbour, но к сожалению не смотря на поддержку этой библиотеки функции не работают. По всей видимости поддержка CTools не полная.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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-- ?



Спасибо: 0 
ПрофильЦитата Ответить



Пост 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() исправлено по-моему. Т.е. надо проверить, лишние действия и правда могут быть.






Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 83
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 12.07.07 15:16. Заголовок: Re:


Я не совсем по-русски изложил свои мысли. Для правильной работы я изменил hb_hbfskip(), и для однообразия так же изменил и hb_freadln(), и прочие. Но, видимо, эти лишнее, хотя и работает. Вообще-то методом тыка, глубоко я не копал. А есть же ещё hb_ReadAndSkip(), можно будет попробовать.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост 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




Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 84
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 13.07.07 09:44. Заголовок: Re:


Петр пишет:

 цитата:
Где ты ее увидел?


Ну как же, вспомни булеву алгебру:
x | x&y = x (потому что x= x&y | x&^y)

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 118
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 16.11.11 16:33. Заголовок: Приходится поднимать..


Приходится поднимать старую тему. В новых версиях MiniGui нет исходников hbmisc.lib ?
Дело в том, что её функции (hb_fReadLn) так и не работают с только LF в качестве конца строки. А файлы такие продолжают встречаться. Если же вставить отдельные функции в программу (в .prg или .c), в доработанном виде (как выше в теме, и как ранее работало - т.е. по большому счёту, как было в misc.lib), то происходит вылет (спрашивает, сообщать в MS об ошибке или нет). Можно где-то увидеть новые исходники, чтобы понять, как надо ещё доработать?

P.S. Хотя, наверно, надо новую тему, в раздел GUI. Прошу модераторов перенести, если возможно.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2196
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.11.11 17:16. Заголовок: AM пишет: В новых в..


AM пишет:

 цитата:
В новых версиях MiniGui нет исходников hbmisc.lib


Не там исходники ищешь , смотри сырцы (x)Harbour

Спасибо: 1 
ПрофильЦитата Ответить
Ответов - 36 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 96
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет