Работа с файлом в C++

154
01 апреля 2018, 21:00

Мне нужно создать файл txt, после чего написать программу, которая читает по строкам файла, подсчитывает кол-во повествовательных предложений и находит в файле 3 повествовательное предложение. Программа должна быть написана без векторов.За повествовательное мы берём предложение, которое кончается точкой. Учитывать троеточие не нужно. Найти в файле 3 предложение, это значит выделить его звёздочкой с двух сторон или slash'ами.

Например:

1 предложение.
2 предложение.
3 предложение?
/\4 предложение./\

Answer 1

Думаю, мое решение может помочь:

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
    string currentSentence = "";
    char ch;
    int sentenceCounter = 0;
    ifstream infile("test.txt"); // your file
    while(infile)
    {
        infile.get(ch);
        /*
        Если текущий символ - точка, то наше предложение утвердительное
        Если счетчик меньше 2, значит увеличиваем счетчик и идем дальше
        */
        if((ch == '.') &&(sentenceCounter < 2))
        {
            sentenceCounter++;
            continue;
        }
        /*
            Если мы уже встретили две точки в файле, то сейчас будет третье предложение.
            Нужно учесть, что могут попадаться ! или ?.
            Если они попадаются, то обнуляем строку и считываем файл дальше пока не дойдем до конца или до точки.
        */
        if(sentenceCounter == 2)
        {
            if((ch != '!') && (ch != '?') && (ch != '.'))
            {
                currentSentence+=ch;
                continue;
            }
            if(ch == '.')
            {
                cout<<currentSentence;
                break;
            }
            //очищаем, если встретился восклицательный или вопросительный знак
            if((ch == '!') || (ch == '?'))
            {
                currentSentence.erase();
                continue;
            }
        }
        currentSentence += ch;
    }

    return 0;
}

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

Тестировал на примере test1 . test2 ? test3 ! test4. test5? test6. test7?, корректно выводит test6.

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

READ ALSO
Использование std::iterator и std::unique_ptr с методами std::copy и std::memcpy

Использование std::iterator и std::unique_ptr с методами std::copy и std::memcpy

В функцию передаётся итератор и количество байт, которое необходимо скопировать в динамический массив к которому есть доступ через unique_ptrКак...

143
переносимость кода

переносимость кода

Для тот, чтоб задать свой вопрос, написал тривиальную структуру

182
Обработчик сигналов как член класса

Обработчик сигналов как член класса

Пишу класс работающий с трафиком RS485 портаПри открытии порта я указываю функцию, вызываемую при наличии во входном буфере порта каких-то...

144
error LNK2019: ссылка на неразрешенный внешний символ main в функции &ldquo;int __cdecl invoke_main(void)&rdquo; (?invoke_main@@YAHXZ)

error LNK2019: ссылка на неразрешенный внешний символ main в функции “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ)

Так как это должно быть приложение, то там должна быть функция int main(){}Возможно, ее роль выполняет функция go

265