Предмет: Информатика, автор: mikimouse9

Написать программу на С++. Задача - Считать текст из файла и вывести на экран только цитаты, т. е. предложения, заключенные в кавычки.


MaxLevs: Отметишь лучшим?
mikimouse9: да

Ответы

Автор ответа: MaxLevs
1

Итак, целевой язык - C++. Это значит мы - радостные обладатели технологии потоков, с коей помощью мы будем производить весь ввод/вывод как при работе с файлами, так и при работе со стандартным вводом/выводом (консолью).

Ну а раз уж мы работаем с потоками, то будем делать это красивенько: создадим класс-обёртку для потока ввода, цель которого - поиск в этом потоке цитат и отправка их на поток вывода (который мы передаём).

[!] Стоит отметить, что по заданию не сказано, что есть разница между ' и ". Поэтому будем считать их одинаковыми.

[!] Внимание! Рядом с исполняемым файлом надо создать текстовый файл data.txt c текстом и цитатами.

Код

С++11

  • #include <iostream>
  • #include <fstream>
  • using std::cout;
  • class QuotesFinder {
  •    std::istream &in_stream;
  •    bool is_it_in_quote = false;
  • public:
  •    QuotesFinder() = delete;
  •    QuotesFinder(QuotesFinder&&) = default;
  •    QuotesFinder(QuotesFinder const&) = default;
  •    explicit QuotesFinder(std::istream &is) : in_stream(is) {}
  •    [[nodiscard]]
  •    bool eof() const {
  •        return in_stream.eof();
  •    }
  •    // Вот тут происходит вся магия
  •    QuotesFinder& operator >> (std::ostream& out_stream) {
  •        char buffer;
  •        in_stream.get(buffer); //Получаем очередной символ из потока
  •        if (buffer == '\"' || buffer == '\'') {
  •            if (is_it_in_quote) {
  •                is_it_in_quote = false;
  •                out_stream << buffer;
  •                out_stream << "\n";
  •                return *this;
  •            }
  •            is_it_in_quote = true;
  •        }
  •        if (is_it_in_quote) {
  •            out_stream << buffer;
  •        }
  •        return *this;
  •    }
  • };
  • int main() {
  •    std::ifstream file("data.txt");  // Открываем файл
  •    if (!file.is_open()) {
  •        cout << "File is not exits!";
  •        return 1;
  •    }
  •    QuotesFinder finder(file);  // Создаём обёртку из файлового потока
  •    while (!finder.eof()) // Пока не достигли конца потока
  •        finder >> cout; // переправляем очередной кусок информации в поток вывода
  • }
Приложения:

MaxLevs: Полностью поддерживаю, вообще useless
mikimouse9: Хелп, у программа показывает ошибку
mikimouse9: для атрибут "nodiscard" нужен флаг компилятора "/ std: c ++ 17"
MaxLevs: убери этот флаг, программа действие не изменит
MaxLevs: [[nodiscard]] говорит просто, чтобы компилятор проверял, записываем ли мы переменную куда-нибудь
MaxLevs: без него всё работает
mikimouse9: можешь скинуть скрины как работает программа? ну как она выводит правильное решение, только нужно чтобы текст был на русском языке
MaxLevs: А сам чего?
MaxLevs: Я не могу изменять решение. Есть пример на английском языке
MaxLevs: На русском всё тоже работате
Похожие вопросы
Предмет: Русский язык, автор: Аноним
Предмет: Алгебра, автор: вилена30