Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
3 / 3 / 4
Регистрация: 23.06.2014
Сообщений: 126

Отображение файла в память, поиск и замена последовательности байт

23.06.2014, 13:38. Показов 5330. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, задача такая: спроецировать файл в память, найти последовательность байт, заменить её и записать изменения в файл.
Вот, что я сам попробовал нацарапать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int _tmain(int argc, _TCHAR* argv[])
{
  HANDLE hFileMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, "file.txt");
  char* p=(char*)MapViewOfFile(hFileMap,FILE_MAP_ALL_ACCESS,0,0,0);
            if(0!=p)
            {
                CloseHandle(hFileMap);
                //find&replace
                while(strncmp(p,"70726F",6))p++;
                memcpy(p,"123456",6);
                return 0;
            }
    return 0;
}
Программа вроде бы компилируется и выполняется, но файл не изменяется. При попытке вывести содержимое файла
C++
1
 cout << p ;
программа крашится.
Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.06.2014, 13:38
Ответы с готовыми решениями:

Отображение файла в память MMF
возможно ли отобразить файл в память и получить handle на него как на обычный файл на диске, и работать с ним из другой программы как с...

Отображение файла в оперативную память
Реализовать отображение файла в оперативную память. Выполнить задание, с использованием этого отображения. Задание: Создать массив...

Поиск последовательности символов и ее замена на другую
Дана строка. Найти последовательность символов, например &quot;!!&quot; и заменить ее на &quot;??&quot; Прошу помощи!

11
Заблокирован
23.06.2014, 13:58
Лучший ответ Сообщение было отмечено mihalech19 как решение

Решение

Цитата Сообщение от mihalech19 Посмотреть сообщение
программа крашится.
ну ты же закрываешь мап файл перед его использованием, начала сделай с ним всё что надо - потом закрывай.
Цитата Сообщение от mihalech19 Посмотреть сообщение
CloseHandle(hFileMap);

Цитата Сообщение от mihalech19 Посмотреть сообщение
while(strncmp(p,"70726F",6))p++;
* * * * * * * * memcpy(p,"123456",6);
а это ваще сущий бред
0
3 / 3 / 4
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 14:13  [ТС]
Допустим... Как тогда лучше реализовать поиск ?

Добавлено через 9 минут
Неужели никто не поможет?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2222 / 1424 / 419
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
23.06.2014, 14:27
Примерчик:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <windows.h>
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
  int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  char file_name [ ] = "Demo.txt" ;
  HANDLE hFile, hMapping; // дескрипторы файла и объекта отображения
  int *ptr; // для указателя на массив
  // открываем файл для вывода
  ofstream out(file_name, ios::out | ios::binary);
  if (!out)
  {
    cerr << "File constructor failed." << endl;
    return 0;
  }
  // выводим исходный массив в файл и на консоль
  cout << "Initial array: ";
  for (int i = 0; i < 10; ++i)
  {
    out.write((char*)&a[i], sizeof(int));
    cout << a[i] << ' ' ;
  }
  cout << endl;
  // закрываем выходной файл
  out.close();
  //
  // открываем файл для отображения в память
  hFile = CreateFile(file_name, GENERIC_READ | GENERIC_WRITE,
                    0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if (hFile == INVALID_HANDLE_VALUE)
  {
    cerr << "Create file failed." << endl;
    return GetLastError();
  }
  // открываем объект, отображающий файл в память
  hMapping = CreateFileMapping(
                                hFile, // дескриптор открытого файла
                                NULL, // атрибуты защиты по умолчанию
                                PAGE_READWRITE, // режим доступа
                                0, 0, // размер объекта отображения равен размеру файла
                                NULL); // имя не используем
  if (!hMapping)
  {
    cerr << "Create file mapping failed." << endl;
    return GetLastError();
  }
  // создаем вид файла
  ptr = (int*)MapViewOfFile(
                            hMapping, // дескриптор объекта отображения
                            FILE_MAP_WRITE, // режим доступа к виду
                            0, 0, // отображаем файл с начала
                            0); // отображаем весь файл
  // изменяем значения элементов массива
  for (int i = 0; i < 10; ++i)
    ptr[i] += 10;
  // отменяем отображение файла в память
  if (!UnmapViewOfFile(ptr))
  {
    cerr << "Unmap view of file failed." << endl;
    return GetLastError();
  }
  // закрываем объект отображения файла в память
  if (!CloseHandle(hMapping))
  {
    cerr << "Close file failed." << endl;
    return GetLastError();
  }
  // закрываем файл
  if (!CloseHandle(hFile))
  {
    cerr << "Close file failed." << endl;
    return GetLastError();
  }
  //
  // открываем файл для ввода
  ifstream in(file_name, ios::in | ios::binary);
  if (!in)
  {
    cerr << "File constructor failed." << endl;
    return 0;
  }
  // вводим финальный массив из файла и выводим на консоль
  cout << "Final array: ";
  for (int i = 0; i < 10; ++i)
  {
    in.read((char*)&a[i], sizeof(int));
    cout << a[i] << ' ';
  }
  cout << endl;
  // закрываем входной файл
  in.close();
  return 0;
}

Стянуто у Побегайло.
0
Заблокирован
23.06.2014, 14:52
Цитата Сообщение от mihalech19 Посмотреть сообщение
Неужели никто не поможет?
а тебе именно программно надо сделать? Так то есть CheatEngine
Цитата Сообщение от mihalech19 Посмотреть сообщение
Как тогда лучше реализовать поиск ?
ну как как, читаешь по указателю первый байт и сравниваешь с первым в заданной последовательности, потом второй... и тд, если вся последовательность совпала - гуд
1
3 / 3 / 4
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 15:06  [ТС]
Тогда такой вопрос: как осуществить чтение сразу из памяти ? Может функция какая есть ?
0
Заблокирован
23.06.2014, 17:10
Цитата Сообщение от mihalech19 Посмотреть сообщение
как осуществить чтение сразу из памяти ?
что значит как? Берёшь и читаешь? Из какой памяти то? :-)
1
3 / 3 / 4
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 17:39  [ТС]
Да, я тупой) Вот я спроецировал файл в память, и как мне прочитать его?)
0
Заблокирован
23.06.2014, 20:30
Лучший ответ Сообщение было отмечено mihalech19 как решение

Решение

Ты лучше озвучь исходную задачу, что тебе конкретно надо сделать, какие исходные данные ?
1
3 / 3 / 4
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 21:04  [ТС]
Та я уже разобрался. Не могу понять теперь, как сохранить изменения в файле(.
0
Заблокирован
25.06.2014, 11:03
Цитата Сообщение от mihalech19 Посмотреть сообщение
Не могу понять теперь, как сохранить изменения в файле
какие изменения? В какой файл? В файл на HDD? А что ты пытаешься туда сохранить? В каком виде твои данные?
0
3 / 3 / 4
Регистрация: 23.06.2014
Сообщений: 126
25.06.2014, 18:56  [ТС]
Я уже разобрался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.06.2014, 18:56
Помогаю со студенческими работами здесь

Поиск и замена последовательности байт в файле
Ребят, умеет ли кто-то из вас работать с бинарниками? Нужно найти определенную последовательность байт, вот она: и заменить...

Поиск и замена указанной последовательности байт в файле, или группе файлов
Доброго времени суток ув. друзья программисты. Нужна помощь, в ассемблере очень слаб, а курсовая в этом семестре не радует. Задание...

Замена последовательности байт в файле
Здравствуйте, необходима помощь в &quot;дореализации&quot; одной задачки на masm32. Есть файл под именем test.txt. В нем находится...

Прочитать 5 байт от начала файла (без загрузки всего файла в память)
Ребят, какие есть варианты быстрого чтения первых 5-ти байт в начале файла? Основная проблема в том, что файлы огромные, могут достигать...

Программа, которая считывает 8 байт из созданного файла MyFile.dat, начиная с 7-го байта, относительно начала, и 10 байт от конца файла
Привет, вот задание собсно Напишите программу, которая считывает 8 байт из созданного ранее файла MyFile.dat, начиная с 7-го байта,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru