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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычисление с точностью до 0,001 суммы членов последовательност http://www.cyberforum.ru/cpp-beginners/thread1215796.html
Пожалуста исправте этот код на с++ что бы нормально считало Составить программу для вычисления с точностью до 0,001 суммы членов последовательности, заданной формуле an= (-1)^2*((n+5)^2)/n!. Добавлять члены последовательности следует до тех пор, пока выполняется an>=e. Через while. #include <iostream> #include <math.h> #include <conio.h> using namespace std; int main() {
C++ Возвращаемая информация в зависимости от типа принимающей переменной Здравствуйте! Читаю книгу "Язык программирования C++. Лекции и упражнения", и запнулся на одном моменте, который я так и не смог понять: Вызов mangle("I 'm glad to meet you") возвращает символ І или указатель на строку "I'm glad to meet you" в зависимости от того, присваивается возвращаемое значение переменной типа char или переменной типа char*. В выделенном тексте и есть загвоздка. Прошу... http://www.cyberforum.ru/cpp-beginners/thread1215795.html
Определить, в каком доме необходимо установить АТС, чтобы расстояние до всех телефонов было минимальным C++
В поселке N домов, расположенных вдоль дороги с одной стороны на равных расстояниях. В деревне проводят телефонную связь.Указано , сколько аппаратов должно быть установлено в кажом доме. Каждый аппарат должен быть связан з АТС отдельным проводом. Определить, в каком доме необходимо установить АТС, чтобы суммарное расстояние от АТС к телефонным аппаратам было минимальное.
C++ Подсчет количества отрицательных элементов в одномерном массиве
Помогите написать программу с использованием функций, подсчета количества отрицательных элементов в одномерном массиве.
C++ Заданы 2 массива, каждый элемент которых вычисляется по формуле http://www.cyberforum.ru/cpp-beginners/thread1215772.html
Задан массив Х (2n), каждый элемент которого вычисляется а формула. Y (n), каждый элемент которого обчислюэться по формуле Y (i) = X (i) + X (i + n), где и изменяется от 1 до n.
C++ Вычислить произведение элементов квадратной матрицы Вычислить произведение элементов квадратной матрицы А (m = n) находящихся под побочной диагональю матрицы. НА ПАскале: program assdfsad; uses crt; const nmax=20; var a:array of integer; i,j,n,d:integer; begin repeat подробнее

Показать сообщение отдельно
caldwell
0 / 0 / 0
Регистрация: 12.06.2014
Сообщений: 17

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

24.06.2014, 23:37. Просмотров 595. Ответов 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru