Сейчас на форуме: vasilevradislav, tyns777, zombi-vadim (+3 невидимых) |
![]() |
eXeL@B —› Программирование —› Изменение куска файла |
Посл.ответ | Сообщение |
|
Создано: 09 февраля 2008 17:37 · Поправил: locker_fx · Личное сообщение · #1 Всем привет! Скорее всего название темы не совсем точно раскрывает вопрос, но ничего лучше в голову не пришло. Вобщем есть прога(Delphi). Необходимо прочитать файл, найти метку, и заменить её на что-то(это что-то вычисляется программой в процессе работы). Сейчас делаю так читаю весь файл в одну строку, потом ищу там метки заменяю их и сохраняю в другие файлы. НО появилась проблема. Если так читать/писать файл, то файл превращается в однострочную кашу. И это создаёт большие трудности. Собственно как можно обойти мои грабли? Читать построчно и одновременно записывать нерезонно, т.к. файлов должно получаться на выходе много. Появилась идея читать файл строками в массив, и потом также сбрасывать в файл. Стоит так делать? Делать блочное чтение/запись кажется не рационально, т.к. работаю с текстовыми файлами. Понимаю, что вопрос глуп, но уже голова не соображает, а сделать надо срочно. Вобщем очень надеюсь на ваши советы. Заранее огромное спасибо! ----- моя подпись! ![]() |
|
Создано: 09 февраля 2008 17:54 · Личное сообщение · #2 |
|
Создано: 09 февраля 2008 18:01 · Личное сообщение · #3 |
|
Создано: 09 февраля 2008 18:48 · Личное сообщение · #4 |
|
Создано: 09 февраля 2008 21:45 · Личное сообщение · #5 locker_fx пишет: найти метку, и заменить её на что-то(это что-то вычисляется программой в процессе работы) Хм, 1-ый и вполне логичный вопрос: метки, раз ты их заменяешь на свои, ты заменяешь на свои, по своему какому-то алгоритму? Если файлы однотипные, то вообщем-то есть резон создавать именно массив у указателями на каждый конкретный элемент, потому как в случае сортировки можно будет применить стандартный сортировочный алгоритм... ----- Программист SkyNet ![]() |
|
Создано: 09 февраля 2008 22:20 · Поправил: locker_fx · Личное сообщение · #6 FrenFolio пишет: Хм, 1-ый и вполне логичный вопрос: метки, раз ты их заменяешь на свои, ты заменяешь на свои, по своему какому-то алгоритму? Если файлы однотипные, то вообщем-то есть резон создавать именно массив у указателями на каждый конкретный элемент, потому как в случае сортировки можно будет применить стандартный сортировочный алгоритм... Наврятли мне придётся это сортировать. У меня есть набор входных данных+файл шаблон. Я читаю шаблон, подготавливаю его, а затем для каждого входного элемента делаю необходимые операции и результат вставляю на место меток. Думаю вариант с чтением в массив оптимален. HiEndsoft пишет: Если скорость не важна, то можно воспользоваться форматом "ini"(Через WritePrivateProfileString): [section1] variable1=value1 variable2=value2 [section2] variable1=value1 variable2=value2 и т.п. Очень удобно и быстро (в смысле кодинга). В данном случае скорость важна. А вообще интересная вещица можно будет где-нибудь применить. Например работа с файлом конфигурации(думаю логично что есть аналогичная функция для чтения). ----- моя подпись! ![]() |
|
Создано: 09 февраля 2008 22:43 · Поправил: HiEndsoft · Личное сообщение · #7 locker_fx пишет: думаю логично что есть аналогичная функция для чтения Да есть, читай MSDN (GetPrivateProfileString и GetPrivateprofileInt), разница в том что API ф-ции данного класса предназначены для работы с ini файлами и реестром и в одном вызове выполняют CreateFile, ReadFile с поисковым алго и CloseHandle...Т.к. они при каждом вызове заново открывают файл, то их частое использование и в циклах очень накладно. Но для чтения конфигурации - самое то. Для своей задачи попробуй спроецировать свой файл в память, и менять копии проекции, меньше работы с файлом - больше быстродействие. ----- продавец резиновых утёнков ![]() |
|
Создано: 10 февраля 2008 00:05 · Личное сообщение · #8 |
|
Создано: 10 февраля 2008 09:58 · Личное сообщение · #9 locker_fx пишет: Думаю вариант с чтением в массив оптимален. Видимо, в этом случае, да. Дальше же HiEndsoft пишет: попробуй спроецировать свой файл в память, и менять копии проекции , тем самым по возможности минимизировав работу с жестким диском. Это позволит значительно увеличить быстродействие, особенно если потом последовательно переписывать выделенные текстовые файлы, уже из массива. ----- Программист SkyNet ![]() |
|
Создано: 10 февраля 2008 12:26 · Личное сообщение · #10 |
|
Создано: 10 февраля 2008 15:42 · Личное сообщение · #11 locker_fx пишет: меньше метра. скореее всего даже за 100кб выходить не будет. Тогда обрати внимание на функу ReadFile Вот как я реализовывад подобное:
Далее, читаешь из массива buffFile... и записываешь все что нужно через WriteFile ----- программистом не рождаются - им умирают ![]() |
|
Создано: 11 февраля 2008 09:30 · Личное сообщение · #12 |
|
Создано: 11 февраля 2008 11:59 · Поправил: HiEndsoft · Личное сообщение · #13 |
|
Создано: 11 февраля 2008 14:30 · Личное сообщение · #14 |
|
Создано: 14 февраля 2008 19:39 · Поправил: RedAbishai · Личное сообщение · #15 Я так понимаю, файл текстовый, а не какой-нибудь бинарник? В общем случае длина метки до/после изменения будет отличаться? Если длина не отличается, то неплохо использовать мемори-маппинг (плюсы: нет проблем с чтением/записью, о буферизации заботится сама винда, как-то читал результаты тестирования - довольно неплохо справляется). ![]() |
|
Создано: 14 февраля 2008 19:48 · Поправил: HiEndsoft · Личное сообщение · #16 |
|
Создано: 14 февраля 2008 20:09 · Личное сообщение · #17 HiEndsoft Молодец, что первый предложил мемори-маппинг использовать, теперь копирайт поставить можешь. И посты я не набиваю. А насчет сравнения скорости - покажи результаты замеров, всем будет интересно посмотреть и со своими сравнить. Мне достаточно было того, что прочитал - незачем каждый раз учиться на собственных ошибках и велосипед изобретать. ![]() |
|
Создано: 14 февраля 2008 20:30 · Поправил: HiEndsoft · Личное сообщение · #18 Я про скорость ничего не говорю, поэтому и предложил сразу же проекцию, потому что чуваку часто к файлу обращаться. Не втему: Если хочешь знать: скорость работы с проекцией и "сырым файло" практически одинакова, если указать флаг кеширования и правильно подобрать размеры буферов ReadFile и WriteFile исходя из DISK_GEOMETRY (что и нужно делать всегда). Совсем недавно "ручками" нужно было делать копию флэшки в виде RAW-образа, так вот что в мап писать что сразу на диск - один хрен все в кэш пишется и флюшится системой в фоне. Причем если вкл. сжатие файло, то у меня (т.к. на флеши 40% занято всего было) кеш отлично оптимизировался системой и реально (ч/з QueryVMem видно) не был забит лишними нулями и был 40% (иди прочитай где про это написано, если найдешь). Иди читай "тесты" дальше. Мне проще и интересней велосипед поизобретать, если из него в итоге мотоцикл получается (а если нет +опыт), чем "тупотесты" по ламер-сайтам искать. ----- продавец резиновых утёнков ![]() |
|
Создано: 16 февраля 2008 20:21 · Личное сообщение · #19 |
|
Создано: 18 февраля 2008 19:53 · Личное сообщение · #20 |
![]() |
eXeL@B —› Программирование —› Изменение куска файла |