@danij_com

Что делать с вектором?

Есть программа, которая призвана находить в заданном файле числовое значение, и менять его на то, которое нужно мне. Но есть одно "но". С маленькими файлами работает отлично, но вот с файлом размером в 250,000 строк появляется проблема. Он просто напросто переписывает первые 141 строку и дальше просто ничего не делается. Что я делаю не так?
#include <QCoreApplication>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <assert.h>
#include <memory>
#include <list>

#define FILE_PATH "C:\\client.dll"
#define STR_TO_FIND "1134"
#define STR_TO_REPLACE "1590"

bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    std::fstream fs(FILE_PATH, std::ios::in | std::fstream::out);
    assert(fs.is_open());

    std::vector<std::string> lines;
    std::string buffer;
    while(getline(fs, buffer))
    {
        replace(buffer, STR_TO_FIND, STR_TO_REPLACE);
        lines.push_back(buffer);
    }
    fs.close();

    fs.open(FILE_PATH, std::ios::trunc | std::fstream::out);
    assert(fs.is_open());

    for(size_t i = 0; i < lines.size(); ++i)
    {
        fs << lines[i] << std::endl;
    }

    fs.close();
    return a.exec();
}


Помогите, ребята.
Файл, если надо, залил сюда rgho.st/6Sg6c4YCW
//Нашел закономерность, зависает он на каждом таком символе 73ce109522bf46e9bb678f8430f2d3fa.jpg
  • Вопрос задан
  • 178 просмотров
Пригласить эксперта
Ответы на вопрос 1
TrueBers
@TrueBers
Гуглю за еду
Как уже сказали в комментах, открывайте с флагом binary. Строки -- это строки, а двоичные данные -- двоичные данные ©Кэп. Каждая функция предназначена для своей задачи, и не стоит её использовать для других. Если ваш пример иногда работает, а иногда нет, это заслуга только рака, который иногда свистит на горе, а иногда ленится. Это во-первых.

Во-вторых, в C++ нет стандартных средств для поиска в бинарных файлах. Придётся писать свою функцию, либо просто скопипастить со StackOverflow, там таких вопросов миллионы. Реализация давно уже написана за вас.

Подсказка: гуглите реализацию функции memmem().
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы