![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 8.6
#include " stdafx.h" #include < iostream> #include < fstream> #include < locale>
using namespace std;
int main() { setlocale(LC_ALL, " Russian"); locale loc (" Russian_Russia"); cout < < " Задание: \nНаписать программу, которая считывает текст\n из файла и выводит на экран предложения, \n содержащие максимальное количество знаков пунктуации.\n"; /*устанавливаем русскую локаль - чтобы писать русскими буквами =)*/
//открываем файл для чтения ifstream FileInput(" file.txt", ios:: in); //если файл не обнаружен, то аварийно выходим if (! FileInput) { cout < < " Ошибка! Файл не открыт! " < < endl; return 1; } cout < < " Текст, в котором осуществляется поиск предложения с max кол-вом знаков пунктуации\n"; cout < < " Чтение из файла выполняется функцией fread(buf, size, num, file) блоками по size байт! Требуется также задать количество блоков num.В программе размер блока задан в переменной равным 1024, поскольку размер кластера кратен степени двойки.В общем случае чем более длинными блоками мы читаем информацию, тем быстрее будет выполнен ввод.Для того, чтобы обеспечить чтение всего файла, к количеству блоков добавляется 1 для округления после деления.\n"; //устанавливаем позицию курсора в конец файла FileInput.seekg(0, ios:: end); /*узнаем длину файла методом tellg(), который сообщает о позиции курсора в файле (т.е. сколько байт прошел курсор)*/ int LengthOfFile = FileInput.tellg(); //создаем переменную для хранения содержимого файла char *str = new char [LengthOfFile+1]; //устанавливаем позицию курсора в начало файла FileInput.seekg(0, ios:: beg); /*считываем содержимое файла в переменную str на заданное число байт LengthOfFile*/ FileInput.read(str, LengthOfFile); //добавляем символ конца строки в переменную str str[LengthOfFile]='\0';
/*pos - текущая позиция в файле; counter - текущее кол-во пунктационных знаков; max - текущее максимальное кол-во пунктационных знаков; l - число символов в предложении; begin, end - начало и конец предложения с макс. кол-вом пункт. знаков*/ int pos = 0, l = 0, end = 0, begin = 0; int counter = 0, max = 0;
//поиск предложения c макс кол-вом пункт. знаков while (str[pos]) { /*если текущий символ явл-ся пунктационным, то счетчик увеличиваем на 1*/ if (ispunct(str[pos], loc)) counter++; //если достигнут конец предложения, то... if (str[pos]=='.' || str[pos]=='! ' || str[pos]=='? ') /*...при условии максиммального кол-ва пунктационных символов вычисляем начало и конец данного предложения...*/ if (counter> max) { max = counter; counter = 0; /*здесь вычисляем начало предложения из текущего положения вычитаем кол-во прошедших символов*/ begin = pos - l; end = pos; l = 0; } /*...иначе обнуляем количество пунктационных символов и количество символов в пердложении*/ else {counter = 0; l = 0; } l++; pos++; } l = begin; //Вывод предложения с максимальным количеством пунктационных знаков for(l; l < end + 1; l++) cout < < str[l];
return 0; } Рисунок 8.4 – Файл для входных данных
|