Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Загрузка файла и обработка в памяти |
Автор: Div 27.6.2005, 20:35 |
Люди помогите! Возникла такая проблемма: надо загрузить файл в отведенную под него память и редактировать его там же. Чтобы можно было указать смещение и записать в переменную типа int байт, который находиться по этому смещению. Помогите плз. Буду очень благодарен! |
Автор: Nuzur 27.6.2005, 21:09 |
А в чем проблема? Можно в подробностях? Дело в том что у тебе есть кусок памяти, значит на него есть указатель, следовательно ты можеш его использовать... 1-е что я могу так сказать...да ничего не могу, порверь у тебя этот участок не онли рид случайно. |
Автор: Div 27.6.2005, 21:16 |
Проблемма в том, что я новичек! Я не умею выделять память и загружать туда файл. Если можешь скинь код! |
Автор: Nuzur 27.6.2005, 23:16 | ||
Конкретное решение зависит от поставленых задач. Ты поставил общюю проблему, короче уточни, что именно тебе нужно, в духе типа это считываю изменя. так-то и кладу сюда. |
Автор: Nuzur 27.6.2005, 23:27 | ||
Конкретное решение зависит от поставленых задач. Ты поставил общюю проблему, короче уточни, что именно тебе нужно, в духе типа это считываю изменя. так-то и кладу сюда. Общее решение может выглядеть так - Создаеш буфер, туда из файла считуеш данные, там изменяеш, потом кладеш куда нуна. 1 Буффер, масив или что там теде нуна думаю создаш са ![]() 2. Считываем: FILE *stream; //Открываем файл stream = fopen(Path + Name, "r" ) //Читаем из него fgets(Str.GetBuffer(fSize),fSize, stream) После чего выполняем все необходимые мат. операции или что там надо. //записываем в файл помоему fputs, почитай в МСДН, щас нет под рукой //Закрываем fclose(stream); Вот пример. Хотя все может быть иначе, и как я писал раньше, все зависит от того что тебе надобно. Что неясно пиши, попробую помочь. |
Автор: codelord 28.6.2005, 01:39 | ||
Держи, надеюсь то, что тебе нужно. Писал в духе Си для одаренных. ![]()
|
Автор: sergejzr 28.6.2005, 01:59 |
codelord, вот так можно узнать имя файла ![]() filelength(fileno(in)); |
Автор: Mayk 28.6.2005, 09:33 | ||
Можно еще вот так, раз файл уже открыт, к тому же это портабельно(filelength нет в c99, в sus2. Не нашелся он в /usr/include'ах):
А еще можно GetFileSize в мастдаях. а еще можно через scan, но это как-то.... слишком |
Автор: sergejzr 28.6.2005, 12:49 | ||
Чтобы совсем портабельно, надо так: Это точно идёт на WIN, Linux, Solaris, AIX, DIGITAL UNIX, SCO. Потомц что мне приходилось кроссплатформенно писать для них. А насчёт filelength, тоже на большинстве идёт без проблем. Просто я считаю не оптимальным бегать указателем по файлу, когда эта инфа давно вырешена и лежит, осталось только взять.
|
Автор: Guest 29.6.2005, 20:00 |
Спасибушки большое ![]() |
Автор: Div 29.6.2005, 20:03 |
Спасибо за разъяснения! Всё идет отлично! Разобрался как следует. СПАСИБО! |
Автор: Div 29.6.2005, 22:15 |
Unregistred был я |
Автор: Div 11.7.2005, 21:14 | ||||||
Немного поразбиравшись, я пришел к выводу, что загружать и далее работать с файлом в памяти лучше таким образом:
Кусок кода на асме записывает в переменную i байт содержащийся по адресу MemoryBuffer. Для изъятия других байтов надо лишь прибавить к MemoryBuffer смещение в памяти. Путь выбирается в окне виндовоза. Чтобы указать имя файла в ручную, надо удалить строки со звездочками и программку заключенную между ними! Тогда CreateFile будет выглядеть так:
name - путь до файла (н-р: "с:\\david\\coding\\filename.txt") Главное в конце не забыть удалить участок памяти:
Очень удобно, кстати. Сам сейчас юзаю такой метод! ![]() |
Автор: Arush 13.7.2005, 18:26 |
Если тебе не нужны все данные файла, то быстрее всего использовать мапирование его в память используя CreateFileMapping. ЗЫ. Твой код на асме аналогичен i=((PBYTE)MemoryBuffer)[0]. Или i=MemoryBuffer[0] если MemoryBuffer объявить как PBYTE ![]() |
Автор: Div 13.7.2005, 21:32 | ||
Не спорю. Но так быстрее ![]() |