C ++ Вставка новой строки после определенного символа в текстовом файле - PullRequest
0 голосов
/ 30 декабря 2018

Я ищу способ поиска определенного символа в текстовом файле и добавления новой строки после каждого ;

Это довольно большой документ (2,7 МБ), если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Вы не можете вставить новые символы в середину существующего файла, только добавить в конец.Вам нужно будет создать новый файл, копируя символы из старого файла в новый файл, вставляя новые символы по мере необходимости.Например:

#include <string>
#include <fstream>

int main()
{
    std::ifstream inFile("input.txt");
    if (!inFile.is_open())
    {
        std::cerr << "Failed to open input file";
        return 1;
    }

    std::ofstream outFile("output.txt");
    if (!outFile.is_open())
    {
        std::cerr << "Failed to create output file";
        return 1;
    }

    std::string line;
    while (std::getline(inFile, line, ';'))
    {
        outFile << line;
        if (!inFile.eof())
            outFile << ";\n";
    }

    return 0;
}
0 голосов
/ 30 декабря 2018

Как указывает SomeProgrammerdude в комментариях, вставка в существующий файл на самом деле неосуществима, и один из ваших вариантов - это прочитать все в один std::string и записать обратно в тот же текстовый файл.
Здесьэто пример реализации.Мы читаем чартер за раз и проверяем, является ли он точкой с запятой, и добавляем новую строку после каждой точки с запятой.Обратите внимание на часть reserve, хотя рекомендуется, но это не обязательно:

#include <string>
#include <fstream>
#include <stdexcept>

int main()
{
  std::fstream f("test.txt", std::ios::in);

  if (!f.is_open()) {
    throw std::runtime_error("Failed to open file");
  }

  std::string contents;
  contents.reserve(10000); // reserve some space for better efficiency
  char ch;
  while (f.get(ch)) {
    contents.push_back(ch);
    if (ch == ';')
      contents.push_back('\n');
  }

  f.close();
  f.open("test.txt", std::ios::out);
  if (!f.is_open()) {
    throw std::runtime_error("Failed to open file");
  }
  f << contents;
  f.close();
  return 0;
}

Ввод:

line line line line; line line line line; line line line; line line

Выход:

line line line line;
 line line line line;
 line line line;
 line line

Обратите внимание на начальные пробелыдо строк.Это потому, что мы добавляли '\n' после каждого ';', а не заменяли пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...