Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.84 KB | None | 0 0
  1. // ConsoleApplication1.cpp: главный файл проекта.
  2.  
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. int main(array<System::String ^> ^args)
  10. {
  11.     /* Создаем файловый поток */
  12.     ifstream fin("input.txt", ios::in);
  13.     /* Добавляем исключение, если файл отсутствует */
  14.     if (!fin)
  15.     {
  16.         cout << "Error opening input.txt file! Exiting..." << endl;
  17.         system("pause");
  18.         return 1;
  19.     }
  20.  
  21.     fin.seekg(0, ios::end); //Переходим в конец файла
  22.  
  23.     long len = fin.tellg(); //Получаем размер
  24.     char *buf = new char[len + 1]; //Создаем буфер с длиной len+1, т.к. строка оканчивается символом '\0'
  25.     char *newBuf = new char[len + 1]; //Во второй буфер запишем предложения, что начинаются не с одной буквы.
  26.  
  27.     fin.seekg(0, ios::beg); //Перекидываемся в начало файла
  28.     fin.read(buf, len); //Считываем весь буфер из файла в переменную buf
  29.     fin.close();        //Закрываем файл
  30.  
  31.     buf[len] = '\0';    //И в конец буфера добавляем символ окончания строки
  32.  
  33.     int i = 0, j = 0;           //Счетчики для основного и для второго буфферов
  34.     bool singleLetter = false;  //Флаг состояния. Если первое слово из одной буквы - true. false по-умолчанию.
  35.  
  36.     /* Пройдемся по всему буферу, выведем преложения, начинающиеся с однобуквенного слова */
  37.     /* Неподходящие предложения запишем в буфер и выведем следующим циклом */
  38.     cout << "\tSentences with one-letter first word:" << endl;
  39.     while (i < len)
  40.     {
  41.         //Если следующий символ - пробел, то ставим флаг
  42.         if (buf[i + 1] == ' ') singleLetter = true;
  43.         //Выводим символы пока не достигнем знака окончания предложения
  44.         while ((buf[i] != '.')
  45.             && (buf[i] != '!')
  46.             && (buf[i] != '?')
  47.             && (buf[i] != '\n')
  48.             && (buf[i] != '\r')
  49.             && (buf[i] != '\0'))
  50.         {
  51.             //Если флаг - true, то выводим символы
  52.             if (singleLetter)
  53.             {
  54.                 cout << buf[i];
  55.             }
  56.             //Иначе, пишем в буфер неподходящих предложений
  57.             else
  58.             {
  59.                 newBuf[j] = buf[i];
  60.                 j++;
  61.             }
  62.             i++;    //Прибавляем счетчик
  63.         }
  64.         /* Наш цикл идет ДО знака препинания и не выводит его */
  65.         /* Поэтому, просто выводим следующий символ и конец строки. 1 строка - одно предложение */
  66.         if (singleLetter)
  67.         {
  68.             cout << buf[i] << endl;
  69.         }
  70.         else
  71.         {
  72.             newBuf[j] = buf[i];     //Если флаг отключен, то записываем знак препинания в буффер
  73.             j++;
  74.         }
  75.         /* Если после знака препинания стоит пробел, то прибавляем двойку, а если нет, то единицу */
  76.         if (buf[i + 1] == ' ') i += 2;
  77.         else i++;
  78.        
  79.         /* Обнуляем флаг первого однобуквенного слова для следующей итерации */
  80.         singleLetter = false;
  81.     }
  82.     newBuf[j] = '\0';
  83.     j = 0;  //Обнуляем счетчик
  84.     cout << endl << "\tOther sentences:" << endl;
  85.     while (newBuf[j])
  86.     {
  87.         cout << newBuf[j];  //Выводим остатки
  88.         if ((newBuf[j + 1] == '.') || (newBuf[j + 1] == '!') || (newBuf[j + 1] == '?'))
  89.         {
  90.             j++;
  91.             cout << newBuf[j] << endl;
  92.         }
  93.         j++;
  94.     }
  95.     cout << endl;
  96.     system("pause");
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement