Как указывает 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'
после каждого ';'
, а не заменяли пробелы.