Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2014, 14:08   #11
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

Ой никогда не любил их. Попробую начать с простого : вывести содержимое небольшого файлика.
Код:
char buf[100];
FILE* text = fopen("file.txt", "r+");
char sFile = fread(buf, sizeof(char), 100, text) ;
cout << sFile << endl;
Что не так?
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 14:34   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А зачем мапировать?
Чтоб не заморачиваться работой с файлами. Получаем указатель и работаем с памятью. Все изменения автоматически записываются обратно в файл. Если не требуется обработка огромных файлов, для которых не хватит адресного пространства - самое то.
waleri вне форума Ответить с цитированием
Старый 24.06.2014, 14:37   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Э-э-э ну во-первых вывод бинарных данных в консоль не даст ничего. Консоль для текстовых данных подходит, а у тебя ДЛЛ. Т.е. от вывода нужно избавляться или выводить в 16-тиричной форме.
Во-вторых: Какая ошибка?
В-третьих:
Код:
char buf[101]={0};
char content[10]={Тут девять байт, которые нужно найтить плюс нулевой байт}
FILE* text = fopen("file.txt", "r+");
int pos=0;
bool ok=false;
int sFile =sizeof(buf)  ;
for(;sFile<sizeof(buf);){
 sFile = fread(&buf, 1, sizeof(buf)-1, text)
 int p=strstr(&content,&buf);
 if(p) {pos+=p; ok=true; break; Нашли нужное.}
 pos+= sFile;
}
if(ok) {fseek(text,pos,SEEK_SET); тут пишем в файл;}
fclose(text);
Т.е. считываем из файла в буффер. Последний байт буффера всегда должен быть под ноль потому -1 к размеру считываемого для strstr(). И считаем сколько байт уже прошло. Если нашли - запоминаем координату найденного и на нее перескакиваем после цикла.
Код с потолка, так что не проверял.
Цитата:
Если не требуется обработка огромных файлов, для которых не хватит адресного пространства - самое то.
Ну спорить не буду. Это ИМХО )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2014, 14:44   #14
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

Посоветуйте пожалуйста как лучше поступить. Вот я смаппировал файл в память, получил указатель, но моя функция find_and_replace принимает значения string.
Код:
void find_and_replace(string& source, string const& find, string const& replace)
{
	for(string::size_type i = 0; (i = source.find(find, i)) != string::npos;)
	{
		source.replace(i, find.length(), replace);
		i += replace.length() - find.length() + 1;
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
// Открываем объект ядра "файл"
HANDLE hFile = CreateFile("client.dll", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// Создаем объект ядра "проекция файла"
HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
// Проецируем в адресное пространство процесса объект "проекция файла"
char* pbFile =  (char*) MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// Проецируем в адресное пространство процесса объект "проекция файла"
DWORD fileSize = GetFileSize(hFile, NULL);
string sFile;
 // Чтение по байтам в sFile
for (int i = 0; i < fileSize; i++)
sFile +=pbFile[i];
find_and_replace(sFile, "1134", "9999") ;
	return 0;
}
Как мне быть дальше, как записать sFile в память, чтобы изменения произошли в самом файле.

Вообще ничего не понял) Лучше уже с маппингом разобраться - так действительно удобнее

Последний раз редактировалось Stilet; 24.06.2014 в 15:08.
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 15:00   #15
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

Нашел решение:
Код:
for (int i = 0; i < fileSize; i++)
  pbFile[i] = sFile[i];
Да, да я чайник)
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 15:09   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вообще ничего не понял) Лучше уже с маппингом разобраться - так действительно удобнее
Да ради бога ) как удобно так и делай.
Цитата:
Да, да я чайник)
Да ладно... Работает - значит кофейник
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2014, 15:14   #17
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

Да , может до звания кофейника я дослужился, но до старшего кофейника еще немного не хватает. Не знаю как задать моей функции строку для поиска с NUL.
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 15:34   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Всмысле строку в которой есть символ \0 ?
P.S. Ох здря ты со string связался... ИМХО в данном случае это совсем не айс...
Я кстати в примере своем тоже маху дал. Вот какая функа тут самое оно: http://www.cplusplus.com/reference/cstring/memcpy/
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.06.2014, 15:44   #19
mihalech19
Пользователь
 
Регистрация: 24.06.2014
Сообщений: 38
По умолчанию

Короче вот так нужная строка выглядит в notepad++
http://hostingkartinok.com/show-imag...84d71f56adb88b
В обычном блокноте вообще вместо нулов пробелы, а в хекс редакторе точки и фиг поймешь как поиск задавать(
mihalech19 вне форума Ответить с цитированием
Старый 24.06.2014, 16:10   #20
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

unsigned char buffer[] = { 0x00, 0x01, 0x02 };
Find(buffer, sizeof(buffer));

Как-то так.
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 03:18
dll, классы и динамическая память Manya Visual C++ 3 15.05.2013 18:28
запись в память загружаемой dll BBBW Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 20.04.2012 00:24
dll в память и запустить =) xrob Общие вопросы Delphi 27 17.03.2012 09:31