Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
#1

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

23.06.2014, 13:38. Просмотров 1436. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 13:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отображение файла в память, поиск и замена последовательности байт (C++):

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

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

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

Поиск и замена файла - C++
Здравствуйте! Никак не могу реализовать функцию для своей программы. Функция производит проверяет наличие файла(ов) в первом заданном...

Указатели: выделить память размером n байт - C++
Мне нужно выделить память размером n байт, но почемуто указатель на эту память всегда размером в 4 байта. char *a = new char; ...

Нужно выделить всю доступную процессу память блоками по 13 байт - C++
Нужно выделить всю доступную процессу память блоками по 13 байт. Использовать нужно две функции : malloc HeapAlloc При этом нужно...

11
SuperHero
Заблокирован
23.06.2014, 13:58 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mihalech19 Посмотреть сообщение
программа крашится.
ну ты же закрываешь мап файл перед его использованием, начала сделай с ним всё что надо - потом закрывай.
Цитата Сообщение от mihalech19 Посмотреть сообщение
CloseHandle(hFileMap);

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

Добавлено через 9 минут
Неужели никто не поможет?
0
Ilot
Модератор
Эксперт С++
1818 / 1176 / 232
Регистрация: 16.05.2013
Сообщений: 3,105
Записей в блоге: 5
Завершенные тесты: 1
23.06.2014, 14:27 #4
Примерчик:
Кликните здесь для просмотра всего текста
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
SuperHero
Заблокирован
23.06.2014, 14:52 #5
Цитата Сообщение от mihalech19 Посмотреть сообщение
Неужели никто не поможет?
а тебе именно программно надо сделать? Так то есть CheatEngine
Цитата Сообщение от mihalech19 Посмотреть сообщение
Как тогда лучше реализовать поиск ?
ну как как, читаешь по указателю первый байт и сравниваешь с первым в заданной последовательности, потом второй... и тд, если вся последовательность совпала - гуд
1
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 15:06  [ТС] #6
Тогда такой вопрос: как осуществить чтение сразу из памяти ? Может функция какая есть ?
0
SuperHero
Заблокирован
23.06.2014, 17:10 #7
Цитата Сообщение от mihalech19 Посмотреть сообщение
как осуществить чтение сразу из памяти ?
что значит как? Берёшь и читаешь? Из какой памяти то? :-)
1
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 17:39  [ТС] #8
Да, я тупой) Вот я спроецировал файл в память, и как мне прочитать его?)
0
SuperHero
Заблокирован
23.06.2014, 20:30 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ты лучше озвучь исходную задачу, что тебе конкретно надо сделать, какие исходные данные ?
1
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
23.06.2014, 21:04  [ТС] #10
Та я уже разобрался. Не могу понять теперь, как сохранить изменения в файле(.
0
SuperHero
Заблокирован
25.06.2014, 11:03 #11
Цитата Сообщение от mihalech19 Посмотреть сообщение
Не могу понять теперь, как сохранить изменения в файле
какие изменения? В какой файл? В файл на HDD? А что ты пытаешься туда сохранить? В каком виде твои данные?
0
mihalech19
3 / 3 / 2
Регистрация: 23.06.2014
Сообщений: 126
25.06.2014, 18:56  [ТС] #12
Я уже разобрался
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2014, 18:56
Привет! Вот еще темы с ответами:

Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память - C++
Читаю уроки по C++ на форуме, почему то автор не хочет все нормально писать, в гугле ничего нормального не нашел, вот зачем в этой...

Проверка расположения последовательности байт числа в памяти - C++
Проверка расположения последовательности байт числа в памяти (должна возвращать динамически созданный массив, в котором содержатся байты...

Поиск в массиве байт - C++
Как произвести поиск в массиве байт? Имеем массив байт А, в нем необходимо выполнить поиск массива В. Как я понимаю, мне необходимо...

Функция, принимающая указатель и число байт и выделяющая память под указатель - C++
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию, принимающую указатель и число байт и выделяющую память под...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
25.06.2014, 18:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru