Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ConsoleApplication1.cpp: главный файл проекта.
- #include "stdafx.h"
- #include <iostream>
- #include <fstream>
- using namespace std;
- int main(array<System::String ^> ^args)
- {
- /* Создаем файловый поток */
- ifstream fin("input.txt", ios::in);
- /* Добавляем исключение, если файл отсутствует */
- if (!fin)
- {
- cout << "Error opening input.txt file! Exiting..." << endl;
- system("pause");
- return 1;
- }
- fin.seekg(0, ios::end); //Переходим в конец файла
- long len = fin.tellg(); //Получаем размер
- char *buf = new char[len + 1]; //Создаем буфер с длиной len+1, т.к. строка оканчивается символом '\0'
- char *newBuf = new char[len + 1]; //Во второй буфер запишем предложения, что начинаются не с одной буквы.
- fin.seekg(0, ios::beg); //Перекидываемся в начало файла
- fin.read(buf, len); //Считываем весь буфер из файла в переменную buf
- fin.close(); //Закрываем файл
- buf[len] = '\0'; //И в конец буфера добавляем символ окончания строки
- int i = 0, j = 0; //Счетчики для основного и для второго буфферов
- bool singleLetter = false; //Флаг состояния. Если первое слово из одной буквы - true. false по-умолчанию.
- /* Пройдемся по всему буферу, выведем преложения, начинающиеся с однобуквенного слова */
- /* Неподходящие предложения запишем в буфер и выведем следующим циклом */
- cout << "\tSentences with one-letter first word:" << endl;
- while (i < len)
- {
- //Если следующий символ - пробел, то ставим флаг
- if (buf[i + 1] == ' ') singleLetter = true;
- //Выводим символы пока не достигнем знака окончания предложения
- while ((buf[i] != '.')
- && (buf[i] != '!')
- && (buf[i] != '?')
- && (buf[i] != '\n')
- && (buf[i] != '\r')
- && (buf[i] != '\0'))
- {
- //Если флаг - true, то выводим символы
- if (singleLetter)
- {
- cout << buf[i];
- }
- //Иначе, пишем в буфер неподходящих предложений
- else
- {
- newBuf[j] = buf[i];
- j++;
- }
- i++; //Прибавляем счетчик
- }
- /* Наш цикл идет ДО знака препинания и не выводит его */
- /* Поэтому, просто выводим следующий символ и конец строки. 1 строка - одно предложение */
- if (singleLetter)
- {
- cout << buf[i] << endl;
- }
- else
- {
- newBuf[j] = buf[i]; //Если флаг отключен, то записываем знак препинания в буффер
- j++;
- }
- /* Если после знака препинания стоит пробел, то прибавляем двойку, а если нет, то единицу */
- if (buf[i + 1] == ' ') i += 2;
- else i++;
- /* Обнуляем флаг первого однобуквенного слова для следующей итерации */
- singleLetter = false;
- }
- newBuf[j] = '\0';
- j = 0; //Обнуляем счетчик
- cout << endl << "\tOther sentences:" << endl;
- while (newBuf[j])
- {
- cout << newBuf[j]; //Выводим остатки
- if ((newBuf[j + 1] == '.') || (newBuf[j + 1] == '!') || (newBuf[j + 1] == '?'))
- {
- j++;
- cout << newBuf[j] << endl;
- }
- j++;
- }
- cout << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement