Как удалить определенные символы из текста fstream? - PullRequest
0 голосов
/ 16 февраля 2019

Я выполняю упражнение, которое предполагает вывод текста из файла после удаления из него всех гласных.Например, файл, содержащий текст «Теория вычислений», должен вывести «Thry f Cmpttn».

Я попытался создать функцию «removeVowel (ifsream &)», которая считывает данные из ifstream и сохраняет их в строке, затем добавляет все не гласные символы в новую строку и возвращает эту строку.

bool isVowel(char ch){

switch (ch) {
case'a':
case'e':
case'i':
case'o':
case'u':
    return true;
}

return false;
}

string removeVowel(ifstream& line){


string ss;

string no_Vow;

while (getline(line, ss)) {

    for (int i = 0; i < ss.size(); i++) {
        if (!isVowel(ss[i]))
            no_Vow += ss[i];
    }
}
return no_Vow;
}

int main() {
string nahmen;
cout << "Enter file name";
cin >> nahmen;

ifstream fs{nahmen};
ofstream fso{ nahmen };

fso << "A quick brown fox jumped over the lazy dog";

string new_s;

new_s = removeVowel(fs);

cout << new_s;

}

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

1 Ответ

0 голосов
/ 16 февраля 2019

Ваш исходный код будет перезаписывать ввод перед тем, как вы его прочитаете, поэтому данные не будут обрабатываться.Обычно вы не хотите уничтожать входные данные для файлов, но если вы это сделаете, вам нужно где-то хранить новое содержимое файла.Для меньшего файла, это может быть хорошо, чтобы сделать это в памяти.Для больших файлов может быть лучше сохранить их во временном файле, а затем переместить временный файл поверх исходного ввода.

Ниже приведен пример использования STL для выполнения задачи, что позволяет сократить объем логики, которую вы используете.должен написать.

#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iostream>
#include <iterator>

namespace {
static bool isVowel(char const ch) {
    // '\0' is considered part of the search string, thus need to handle it separately
    return (std::strchr("aeiouAEIOU", ch) != nullptr) && (ch != '\0');
}

static void setOutputExceptions(std::ostream &os) {
    // Set exceptions on this we usually don't want to handle for output strings
    os.exceptions(std::ios_base::badbit | std::ios_base::eofbit | std::ios_base::failbit);
}
}  // close unnamed namespace

int main() {
    setOutputExceptions(std::cout);
    std::cout << "Enter file name: ";

    std::string nahmen;
    std::cin >> nahmen;
    if (!std::cin) throw std::runtime_error("Unable to read file name");

    std::string fileContent;
    {
        std::ifstream fs{nahmen};
        if (!fs) throw std::runtime_error("unable to open file " + nahmen);
        // we do not copy the vowels to fileContent to save space
        remove_copy_if(std::istreambuf_iterator<char>(fs), std::istreambuf_iterator<char>(),
                       back_inserter(fileContent),
                       isVowel);
    }  // close fs
    // we don't to have a input and output handle to the same file at the same time
    {
        std::ofstream fso;
        setOutputExceptions(fso);
        fso.open(nahmen);
        fso << fileContent;
    }  // close fso
    return EXIT_SUCCESS;
}
...