функция replace_copy_if

405
31 июля 2017, 13:38

Необходимо считать файл и заменить все символы кириллицы на пробелы, затем полученный результат вывести на экран. что нужно передать в качестве третьего параметра replace_copy_if?

{
ifstream in;
in.open(fileName, ios::in);
if (in.is_open())
{
setlocale(LC_ALL, "Russian");
string str((std::istreambuf_iterator<char>(in)), 
std::istreambuf_iterator<char>());
string str1;
replace_copy_if(
        str.begin(),
        str.end(),
        str1.begin(),
        [](char n) {return ( n > -65 && n < 0); },
        ' '
    );
ostream_iterator<char> out(cout);
copy(str1.begin(), str1.end(), out);
}
else
{
    cout << "Could not open the file" << endl;
}
}
Answer 1

Третьим параметром должен быть итератор на начало диапазона в который будет записан результат. Причем размер этого диапазона должен быть не меньше исходного. В вашем коде это условие не выполняется. Я вижу 3 варианта как это исправить.

1) Увеличить размер str1 до размера str при помощи заполняющего конструктора:

string str1(str.size(), 0);

2) Использовать std::back_inserter:

std::replace_copy_if(
        str.begin(),
        str.end(),
        std::back_inserter(str1),
        [](char n) {return ( n > -65 && n < 0); },
        ' ');

3) Выводить прямо на экран:

std::replace_copy_if(
        str.begin(),
        str.end(),
        std::ostream_iterator<char>(std::cout),
        [](char n) {return ( n > -65 && n < 0); },
        ' ');
Answer 2

Там должен быть унарный предикат, т.е функция возвращающая true или false. В вашем случае это должно быть что-то вроде "Найдена кириллица".

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

Вся подробная информация http://en.cppreference.com/w/cpp/algorithm/replace

READ ALSO
cmake проблема со сборкой

cmake проблема со сборкой

Собрался настроить сборку у себя на компьютере скачал последний cmake 39

311
Форк криптовалюты BoolBerry(XBB)

Форк криптовалюты BoolBerry(XBB)

Прошу знающих помочь с созданием форка криптовалюты созданной на c++Криптовалюта называется BoolBerry(XBB), проблема следящая: Не могу запустить...

376
Работа с ошибками в С++. Деление на ноль

Работа с ошибками в С++. Деление на ноль

Пишу свой проект в учебных целях для работы с обыкновенными дробями

414
Не работает ofstream

Не работает ofstream

Вот код:

324