asyaevloeva
@asyaevloeva

Как заменить символы в текстовом файле?

Мне нужно заменить все встретившиеся символы ()[]{}""';:,.?!- в текстовом файле на такие же, только с добавлением пробелов с двух сторон у каждого такого символа, все остальные символы и буквы не английского алфавита заменить на пробел, и перевод строки тоже заменить на пробел.
Подскажите как это лучше всего сделать с использованием только стандартных библиотек C++?
  • Вопрос задан
  • 2471 просмотр
Решения вопроса 2
TrueBers
@TrueBers
Гуглю за еду
Подскажите как это лучше всего сделать с использованием только стандартных библиотек C++?

Если прям true C++ way, то вам нужно использовать std::fstream. Для него нужно реализовать стандартный std::streambuf и во время записи в файл, когда буфер сбрасывается, у std::streambuf вызывается виртуальный метод overflow(), вот его перегружаете, проходите по буферу, делаете нужные вам изменения и сбрасываете буфер дальше на запись. Примерно, как тут.
Это если важна архитектура, гибкость, переиспользование кода и трушность C++.

А если более-менее простой вариант, то недо-true C++ way выглядит
примерно так
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>

int main() {

  std::ofstream out_file( "out.txt" );
  std::ifstream in_file( "in.txt" );
  std::string/*stream*/ some_buffer;

  using char_type = decltype(out_file)::char_type;
  using in_iter = std::istream_iterator< char_type >;

  if ( !in_file.is_open() || !out_file.is_open() )
    return EXIT_FAILURE;

  std::transform(in_iter(in_file), in_iter(), std::ostream_iterator< char_type >(out_file),
                 [&some_buffer] (const char_type &c) {

                   if ( !std::isalpha( static_cast<unsigned char>(c) ) || c == '\n' || c == '\r' )
                     return ' ';

                   // if шило, then мыло, буферизуем если надо, и т. п.

                   return c;
                 });

  return EXIT_SUCCESS;
}
Ответ написан
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Пригласить эксперта
Ваш ответ на вопрос

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

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