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

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

Войти
Регистрация
Восстановить пароль
 
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17
#1

Поиск и замена строк в бинарном файле - C++

24.06.2014, 23:37. Просмотров 606. Ответов 0
Метки нет (Все метки)

Помогите написать программу. Строки я пометил маркером MARK_BEGIN<строка>MARK_END. Нужно найти и заменить в бинарном файле все строки, соответствующие шаблону.

Научился искать строки в файле, но как теперь заменить fullMatch на stringMath и вставить обратно в файл? Остаток строки нужно забить нулями.

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
#include "stdafx.h"
 
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    std::ifstream ifs(argv[1], ios::binary);
    std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
 
    std::smatch matches;
    std::regex rgx ("(MARK_BEGIN)(.*?)(MARK_END)");
 
    while (std::regex_search (str,matches,rgx)) {
        std::string fullMatch = matches[0].str(); 
        std::string stringMatch = matches[2].str();
        printf("Found match: %s\n", stringMatch.c_str());
        str = matches.suffix().str();
    }
 
    return 0;
}
Добавлено через 11 часов 3 минуты
Отвечу себе сам. Нужно заменить ofstream на fstream, открыть файл на чтение-запись и в цикле по найденным строкам определять позицию полного совпадения, писать туда целевую строчку и добивать ее нулями через string.append

Итого получилась такая вот штука:
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
#include "stdafx.h"
 
#include <iostream>
#include <fstream>
#include <string>
#include <regex>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    std::fstream ifs(argv[1], ios::binary|ios::out|ios::in);
    std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
 
    std::smatch matches;
    std::regex rgx ("(START_MARK)(.*?)(END_MARK)");
 
    while (std::regex_search (str,matches,rgx)) {
        printf("Found match: %s at position: %d... ", matches[2].str().c_str(), matches.position(2));
        std::string fullMatch = matches[0].str(); 
        std::string stringMatch = matches[2].str();
        size_t appendSize = fullMatch.size() - stringMatch.size(); 
        stringMatch.append(appendSize, '\0');
        ifs.seekp(matches.position(0));
        ifs.write(stringMatch.c_str(), stringMatch.size());
        printf("replaced\n");
        str = matches.suffix().str();
    }
    ifs.close();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2014, 23:37     Поиск и замена строк в бинарном файле
Посмотрите здесь:

Поиск и замена символов в файле C++
C++ Поиск и замена текста в файле
Поиск заданной последовательности символов в бинарном файле C++
Бинарный поиск в бинарном файле C++
C++ Поиск по структуре в бинарном файле
Поиск числа в файле, открытым в бинарном режиме C++
Поиск в бинарном файле с использованием файловых потоков C++
C++ Поиск в бинарном файле
Замена определенных строк в бинарном файле C++
Замена строк в файле C++
C++ Поиск в бинарном файле
C++ Замена элементов в бинарном файле

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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