Считать три предложения из файла и вывести их в обратном порядке

Есть задание, цитирую точно как в методичке: "Написать программу которая считывает из текстового файла три предложения и выводит их в обратном порядке". Звучит так, будто в файле всегда должно быть только три предложения. Как оказалось, нужно сделать так, чтобы программа считала и вывела ПЕРВЫХ три предложения в обратном порядке. Вот так выглядит мое решение:

    ifstream fin("sen.txt");
string str, sdel(".!?");
stack<string> stk;
if (!fin) {
    cout << "Ошибка открытия файла!" << endl;
    system("pause");
    return 1;
}
for (char c; fin.get(c); )
{
    str += c;
    if (sdel.find(c) != string::npos)
    {
        stk.push(str);
        str.clear();
    }
}
for (; !stk.empty(); stk.pop())
{
    if (stk.size() <= 3) {
        cout << stk.top();
    }
}
return 0;

Такое решение у меня не приняли, то-есть, у меня программа если находит какой-то из знаков ".!?" то отделяет все что было до этого предложением, включая знак и запихивает в стек. Как мне сказал преподаватель: "Точка не обязательно есть концом предложения". Дальше он начал рассказывать такое: Начало - большая буква, конец - . ! ? Предложение может находится - только в одной строке, но строка может содержать много предложений. Это называется формализацией.

Честно говоря, я не очень то понял, что это значит, и как мне определять, конец ли предложения...


Ответы (1 шт):

Автор решения: alex
std::string separator{
        " \t\r\n,.!?;:"
    };
    std::string line;
    std::ifstream ifs(R"(D:\stackoverflow\cpp\text.txt)");
    if (!ifs.is_open()){
        std::cerr << "Couldn't open file..." << std::endl;
        return -1;
    }
    while(getline(ifs,line)){
        size_t e, s = 0;
        do {
            s = line.find_first_not_of(separator, s);
            if (s == std::string::npos)
                break;
            e=line.find_first_of(separator, s);
            std::string word(line.substr(s,e - s));
            std::cout << word << " ";
            s = e + 1;
            result.emplace_back(word);
        } while (e != std::string::npos);
    }

Пример MBo "В.В.Иванов любит фрукты, в т.ч. абрикосы.", на входе: "V.V. Ivanov loves fruits, incl. apricots.". На выходе "V V Ivanov loves fruits incl apricots".

→ Ссылка