Выделение предложения с обеих сторон в файле

265
04 апреля 2018, 10:47

Есть файл. В нём нужно посчитать количество повествовательных предложений и выделить 3 повествовательное предложение с обеих сторон. Повествовательным предложением считать то предложение, которое оканчивается точкой. Программу я уже написал, и с правой стороны предложение выделяется исправно, но к сожалению с левой стороны не выходит. Приведу пример.

1 предложение.

2 предложение.

3 предложение?

4 предложение!

====> 5 предложение. <====

Примерно так это должно выглядеть, а у меня это так: 5 предложение. <====

При том, хочу отметить, что 2 или более предложения могут идти в одну строчку, то есть не всегда, когда кончается предложение нужно переходить на новую строчку. Код прилагаю.

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
using namespace std;
int main()
{
    setlocale (0,"rus");
    FILE *f;
    char ch;
    int t=0, kolvo = 0, ob=0;
    if ((f = fopen("File.txt","r"))== NULL)
{
    printf("Невозможно открыть файл.\n");
    return 0;
}
    f = fopen("File.txt","r");  
    while(!feof(f))
    {
        fscanf(f, "%c", &ch);
        cout<<ch; 
    }
    fseek(f,0,SEEK_SET);
    while(!feof(f))
    {
        ch = fgetc(f);
        for (int i=0;i<3;i++)
        if (ch == '.')
        {       
            kolvo++;
            break;
        }       
    }
     cout<<"\nКоличество повествовательных предложений:"<<kolvo<<endl<<endl;
     system("pause");
     system("cls");
    fseek(f,0,SEEK_SET);
    while(!feof(f))
    {
        ch = fgetc(f);
        if(ch=='.')t++;
        if(t==3 && ch=='.')
        cout<<"   <======";
        cout<<ch; 
    }
    return 0;
}  
Answer 1
string s;
list<string> vs;
istream_iterator<string> first(cin), last;
while (first != last) {
    s += *first;
    if(!ispunct(s.back()))
        s += ' ';
    else {
        vs.emplace_back(s);
        s.clear();
    }
    ++first;
}
vs.remove_if([](string t) {return t.back() != '.'; });
// vs содержит ваши предложения

только остается вместо cin использовать файловый обьект А можно просто найти позиции знаков пунктуации и записывть строку, если строка заканчивается пунктуацией '.', начиная от позиции предыдущего знака пунктуации

READ ALSO
Quick Sort с использованием boost coroutine

Quick Sort с использованием boost coroutine

Есть задание написать алгоритм быстрой сортировки с использованием сопрограмм из библиотеки boostВроде написал, но получается, что он по времени...

255
Перенос программы Qt, взаимодействующей с Mysql

Перенос программы Qt, взаимодействующей с Mysql

Имеется программа, написанная на Qt под linux, в которой происходит взаимодействие с БД MySqlНа компьютере с Qt она прекрасно работает, однако, при...

257
проблема с неполным типом и forward declaration

проблема с неполным типом и forward declaration

есть класс бинарного дерева:

270
Как вывести слова встречающиеся в обоих файлах?

Как вывести слова встречающиеся в обоих файлах?

Имеются 2 файла, в каждом из них словаНужно вывести на экран консоли слова, которые встречаются в обоих файлах

257