Re: Низкоуровневая обработка файла? | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Вот вместо спасибо мог бы и 200 баксов подкинуть ssa
------------------ Позовите санитаров |
Re: Низкоуровневая обработка файла? | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Я догадался. Цитата:1. Вот как раз вопроса то и не было и нет. Есть только какое-то задание. Что и есть очень не вежливо. 2. Выдача задания таким тоном почти всегда вызывает подобную реакцию. Ибо тут не мальчики на побегушках у всех встречных-поперечных собрались для решения проблем этих самых всех встречных-поперечных. ------------------ Лень - это неосознанная мудрость. |
Re: Низкоуровневая обработка файла? | |
---|---|
Igor Korolyov Автор Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ошибка 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 |
© 2000-2024 Fox Club  |