:: Visual Foxpro, Foxpro for DOS
Re: Низкоуровневая обработка файла?
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Вот вместо спасибо мог бы и 200 баксов подкинуть ssa


------------------
Позовите санитаров
Ratings: 0 negative/0 positive
Re: Низкоуровневая обработка файла?
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
sasha9
Это не в Ваш адрес (это касается spinz).
Я догадался.
Цитата:
В чем я себя невежливо повел?
Я просто задал вопрос, а в ответ услышал от всех КРОМЕ ВАС очень много "лестных" слов.
1. Вот как раз вопроса то и не было и нет. Есть только какое-то задание. Что и есть очень не вежливо.
2. Выдача задания таким тоном почти всегда вызывает подобную реакцию. Ибо тут не мальчики на побегушках у всех встречных-поперечных собрались для решения проблем этих самых всех встречных-поперечных.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Низкоуровневая обработка файла?
Igor Korolyov
Автор

Сообщений: 34580
Дата регистрации: 28.05.2002
sasha9
Замены добился. Но нарушается структура модифицированого файла condi1.sav (исходный и созданный файл лежат в архиве)
lcStr1 = '_55H0YKTHJ'
lcStr2 = SYS(2015)
lnHndlNew = FCREATE('condi1.sav')
lnHndl = FOPEN('condi.sav')
gnPosition = FSEEK(lnHndl, 0)&& не нужно, после открытия указатель и так в начале файла
DO WHILE !FEOF(lnHndl)
lcStr = FGETS(lnHndl) && ошибка 1
lcStr = STRTRAN(lcStr,lcStr1,lcStr2)
FPUTS(lnHndlNew, lcStr) && ошибка 2
ENDDO
=FCLOSE(lnHndl)
=FCLOSE(lnHndlNew)

Ошибка 1
FGETS читает из файла "строку" - байты до нахождения спецсимвола "возврат каретки" CHR(13). При этом символ "перевод строки" CHR(10) вообще игнорируется. Сам символ возврат каретки НЕ возвращается этой функцией. И ещё - эта функция имеет ограничение на размер считываемого блока данных - по умолчанию это 254 байта, можно настроить до 8192 байт - т.е. если в этом диапазоне не было CHR(13), всё равно функция вернёт байты как будто этот символ в конце есть.
Ошибка 2
FPUTS записывает в файл опять таки "строку" - т.е. переданный набор байт ПЛЮС символы возврат каретки И перевод строки CHR(13)+CHR(10).
Собственно говоря именно это и "портит" файл.

Совершенно очевидно что для бинарного файла FGETS/FPUTS совершенно не подходят - они могут применяться исключительно для текстовых файлов в ANSI (однобайтной) кодировке, со "стандартными" для винды концами строк CHR(13)+CHR(10), и с таким же "концом строки" после самой последней строки, с индивидуальными "строками" в файле не длиннее 8Кб - во всех прочих случаях будет происходить искажение на месте этих самых "концов строк", или на границе блока чтения FGETS (если явно не задано, это будет 254 байта-символа).

Для бинарных файлов следует применять FREAD/FWRITE. При том надо учесть, что искомая последовательность вполне может оказаться на границе блоков - т.е. скажем символы "_55H0" в одном блоке (в самом его конце), а остаток "YKTHJ" - в следующем (в самом начале). Т.е. таким "простым" циклом задачу уже не решить.

Приведенный Сергеем вариант с "одномоментным" чтением всего файла в переменную подойдёт в том случае если файл не очень большой - формально ограничение на строковую переменную в фоксе 16Мб, реально FileToStr способен считать и гораздо больший размер (ограничивается доступной фоксу памятью - может достигать и 500-600Мб, для только что запущенного фокса) - но с учётом того что строка будет модифицироваться при помощи STRTRAN (а это потребует копирования всей строки в новое место в памяти) реально (более-менее надёжно/безопасно - т.е. без возникновения ошибок нехватки памяти) работать таким образом можно где-то до размеров входного файла в 200Мб.

P.S. Если бы вопрос ИЗНАЧАЛЬНО был задан в таком виде - т.е. что требуется и код который написан, но имеет проблемы и просьба о помощи - никаких "наездов" не было бы и в помине.


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 18 (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика