Форум » Clipper » Чтение строк из файла » Ответить

Чтение строк из файла

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

Ответов - 36, стр: 1 2 All

armik: ewferg

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

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


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

Dima: AM пишет: А где взять? Сама библиотека есть, исходников нет. у меня тут лежит C:\CVS\xharbour\source\misc\hb_f.c

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

suv7: AM пишет: Вот такой, вроде как простой, вопрос, но ответа не нашёл. Есть ли в Клиппере или Харборе функция, которая читает строки (по одной) из файла? а в чем проблема - 10 строк написать? AM пишет: Если читать из файла побайтно попробуй читать по 2 байта зараз. Будет в 2 раза быстрей Dima!!! задолбал меня форум, постоянно на пароль ругается!!!! то он с ником совпадает, то не подходит!!!!! Уже седьмой ник завел! Удали пользователя suv.... suv6 я зарегистрирую снова suv

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

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

Петр: 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-- ?

AM: Петр пишет: ((*(b + x) == 10) && (*(b + x + 1) == 13)) || (*(b + x) == 10)) Так получается тавтология. Лучше просто убрать && (*(b + x + 1) == 13)) На самом деле на практике у меня встречаются файлы с CRLF и с LF. И, естественно, надо, чтобы работало и с тем и с другим без подсказок человека. LFCR пока не было, но кто знает? Твой пример (только разобраться со скобками) правильно работает вроде бы на всех комбинациях! Но только если в функции hb_hbfskip() исправлено по-моему. Т.е. надо проверить, лишние действия и правда могут быть.

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

Петр: AM пишет: Так получается тавтология. Где ты ее увидел? Это нормальный код, который работает с CRLF, LFCR и LF. Изменения в других функциях (той же hb_fskip() ) нужны, причем обязательно. Для увеличения быстроты можно еще поиграться с #define b_size 4096 #define c_size 4096

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

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

Dima: AM пишет: В новых версиях MiniGui нет исходников hbmisc.lib Не там исходники ищешь , смотри сырцы (x)Harbour



полная версия страницы