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