lab10_2 (1080927), страница 2

Файл №1080927 lab10_2 (Готовые ЛР и ДЗ (ИУ5)) 2 страницаlab10_2 (1080927) страница 22018-01-11СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

char string[lenString];

char next;

cout << "\n Текст файла:\n\n";

cin.get(); // Убирает код из потока cin

while(1) // Неограниченный цикл

{ // Ввод из файла одного слова до пробельного символа либо EOF:

inFile >> string;

// Проверка следующего символа:

next = inFile.peek();

// Выход при достижении конца файла:

if (next == EOF) break;

// Печать с добавлением разделительного пробела:

cout << string <<” “;

if (next == '\n') // Обработка конца строки

{ cout << '\n';

// 4 - смещение для первой страницы экрана:

static int i = 4;

// Деление по страницам до 20 строк каждая:

if (!(++i % 20))

{ cout << "\nДля продолжения вывода нажмите ENTER.\n" << endl;

cin.get() ;

}

}

}

Результат выполнения программы - постраничный вывод на эк­ран текстового файла, имя которого набирает на клавиатуре пользо­ватель по "запросу" программы. Размер страницы - 20 строк. В начале первой страницы - результат диалога с пользователем и поэтому из файла читаются и выводятся только первые 16 строк.

Программа демонстрирует неудобства чтения текста из файла с помощью операции извлечения >>, которая реагирует на каждый об­общенный пробельный символ. Между словами, прочитанными из файла, принудительно добавлено по одному пробелу. А сколько их (пробелов) было в исходном тексте, уже не известно. Тем самым иска­жается содержащийся в файле текст. Читать пробельные символы по­зволяет компонентная функция getline() класса istream, наследуемая классом ifstream. Текст из файла будет читаться и вы­водиться на экран (в поток cout) без искажений (без пропусков про­белов), если в предыдущей программе чтение и вывод в поток cout организовать таким образом:

while(1) // Неограниченный цикл

{ inFile.getline(string,lenString);

next = inFile.peek();

if (next == EOF) break;

cout << string;

…..Потоки ввода-вывода. В соответствии с названием заголовочного файла iostream.h (stream - поток; "i" - сокращение от input - ввод "o" - сокращение от output - вывод) описанные в этом файле средства ввода-вывода обеспечивают программиста механизмами для извлечение данных из потоков и для включения (внесения) данных в потоки. Поток определяется как последовательность байтов (символов) и с точки зрения программы не зависит от тех конкретных устройств (файл на диске, принтер, клавиатура, дисплей, стример и т.п.), с которыми ведется обмен данными. При обмене с потоком часто используется вспомогательный участок основной памяти - буфер потока (рис.1- буфер вывода, рис. 2 - буфер ввода).

Рис. 1. Буферизированный выходной поток

В буфер потока помещаются выводимые программой данные перед тем, как они будут переданы к внешнему устройству. При вводе данных они вначале помещаются в буфер и только затем передаются в область памяти выполняемой программы. Использование буфера как промежуточной ступени при обменах с внешними устройствами по­вышает скорость передачи данных, так как реальные пересылки осу­ществляются только тогда, когда буфер уже заполнен (при выводе) или пуст (при вводе).

Работу, связанную с заполнением и очисткой буферов ввода-вывода, операционная система очень часто берет на себя и выполняет без явного участия программиста. Поэтому поток в прикладной про­грамме обычно можно рассматривать просто как последовательность байтов. При этом очень важно, что никакой связи значений этих байтов с кодами какого-либо алфавита не предусматривается. Задача программиста при вводе-выводе с помощью потоков - установить со­ответствие между участвующими в обмене типизированными объек­тами и последовательностью байтов потока, в которой отсутствуют всякие сведения о типах представляемой (передаваемой) информации.

Рис .2. Буферизированный входной поток

Используемые в программах потоки логически делятся на три типа:

  • входные, из которых читается информация;

  • выходные, в которые вводятся данные;

  • двунаправленные, допускающие как чтение, так и запись.

Все потоки библиотеки ввода-вывода последовательные, т.е. в каждый момент для потока определены позиции записи и (или) чтения, и эти позиции после обмена перемещаются по потоку на длину переданной порции данных.

Функции для обмена с потоками

Кроме операции включения (записи) в поток << и извлечения (чтения) из потока >>, в классах библиотеки ввода-вывода есть весьма полезные функции, обеспечивающие программиста альтернативными средствами для обмена с потоками.

При выводе в качестве основного класса, формирующего выход­ные потоки, используется класс ostream. В нем определены (ему при­надлежат) две функции для двоичного вывода данных:

ostream& ostream::put(char cc);

ostream& ostream::write(const signed char *array, int n);

ostream& ostream::write(const unsigned char *array, int n) ;

Функция put () помещает в тот выходной поток, для которого она вызвана, символ, использованный в качестве фактического парамет­ра.

В этом случае эквивалентны операторы:

cout << 'Z';

и

cout.put('Z');

Функция write () имеет два параметра - указатель array на учас­ток памяти, из которого выполняется вывод, и целое значение n, определяющее количество выводимых из этого участка символов (байт).

В отличие от операции << включения в поток функции put () и write () не обеспечивают форматирования выводимых данных. На­пример, если при выводе одного символа с помощью операции << можно, используя функцию width (), разместить его в поле из нужно­го количества позиций, то функция put() всегда разместит символ в одной позиции выходного потока. Флаги форматирования также не применимы к функциям put() и write().

Так как функции put() и write() возвращают ссылки на объект того класса, для которого они выполняются, то можно организовать цепочку вызовов:

char ss[] = "Merci";

cout.put('\n').write(ss,sizeof(ss)-l).put('!').put('\n');

На экране (в потоке cout) появится:

Merci!

Если необходимо прочитать из входного потока строку символов, содержащую пробелы, то с помощью операции извлечения >> это де­лать неудобно - каждое чтение строки выполняется до пробела, а ве­дущие (левые) пробельные символы игнорируются. Если мы хотим, набрав на клавиатуре строку: "Qui vivra verra - будущее покажет (лат.) ", ввести ее в символьный массив, то с помощью операции извлечения >> это сделать несколько хлопотно, все слова будут читаться отдельно (до пробела). Гораздо удобнее воспользоваться функциями бесформатного (двоичного) чтения.

Функции двоичного (бесформатного) чтения данных принадлежат потоку istream. Прежде чем перечислить их, отметим основное свой­ство двоичного чтения данных. Данные читаются без преобразования их из двоичного представления в текстовое. Например, если во вход­ном потоке размещено представление вещественного числа

1.3е-3, то это будет воспринято как последовательность из шести байт, и читать эту последовательность с помощью функций двоичного ввода можно только в символьный массив.

Итак, функции чтения.

Во-первых, это 6 перегруженных функций get (). Две из них имеют следующие прототипы:

istream& get(signed char *array, int max_len, char ='\n');

istream& get(unsigned char *array, int max_len, char ='\n');

Каждая из этих функций выполняет извлечение (чтение) последо­вательности байтов из стандартного входного потока и перенос их в символьный массив, задаваемый первым параметром. Второй пара­метр определяет максимально допустимое количество прочитанных байтов. Третий параметр определяет ограничивающий символ (байт), при появлении которого во входном потоке следует завершить чтение. По умолчанию третий параметр имеет значение '\n' - переход на следующую строку, однако при обращении к функции его можно за­давать и по-другому. Значение этого третьего параметра из входного потока не удаляется, он в формируемую строку (символьный массив) не переносится, а вместо него автоматически добавляется "концевой" символ строки ' \0'. Если из входного потока извлечены ровно max_len - 1 символов, однако ограничивающий символ (например, по умолчанию '\n') не встретился, то концевой символ помещается после введенных символов. Массив, в который выполняется чтение, должен иметь длину не менее max_len символов. Если из входного потока не извлечено ни одного символа, то устанавливается код ошибки. Если до появления ограничивающего символа и до извлече­ния max_len - 1 символов встретился конец файла EOF, то чтение прекращается как при появлении ограничивающего символа.

Функция с прототипом

istream& get(streambuf& buf, char = '\n');

извлекает из входного потока символы и помещает их в буфер, опре­деленный первым параметром. Чтение продолжается до появления ограничивающего символа, которым по умолчанию является '\n', но он может быть установлен явно любым образом.

Три следующих варианта функции get() позволяют прочесть из входного потока один символ. Функции

istream& get(unsigned char& cc) ;

istream& get(signed char& cc) ;

присваивают извлеченный символ фактическому параметру и воз­вращают ссылку на поток, из которого выполнено чтение. Функция

int get() ;

получает код извлеченного из потока символа в качестве возвращае­мого значения. Если поток пуст, то возвращается код конца файла EOF.

Функции "ввода строк":

istream& getline(signed char *array, int len, char= '\n');

istream& getline(unsigned char *array, int len, char= '\n');

подобны функциям get () с теми же сигнатурами, но переносят из входного потока и символ-ограничитель. Функция

int peek () ;

позволяет "взглянуть" на очередной символ входного потока. Точнее, она возвращает код следующего символа потока (или EOF, если поток пуст), но оставляет этот символ во входном потоке. При необходимости этот символ можно в дальнейшем извлечь из потока с помощью других средств библиотеки. Например, следующий цикл работает до конца строки (до сигнала от клавиши Enter ):

char cim;

while (cin.peek() != '\n')

{ cin.get(cim);

cout.put(cim) ; }

Принадлежащая классу istream функция

istream& putback (char cc);

не извлекает ничего из потока, а помещает в него символ cc, который становится текущим и будет следующим извлекаемым из потока сим­волом.

Аналогичным образом функция

int gcount ();

подсчитывает количество символов, которые были извлечены из входного потока при последнем обращении к нему. Функция

istream& ignore(int n=l, int EOF);

позволяет извлечь из потока и "опустить" то количество символов n, которое определяется первым параметром. Второй параметр определяет символ-ограничитель, при появлении которого выполнение функции нужно прекратить, даже если из потока еще не извлечены все n символов. Функции

istream& read(signed char *array, int numb);

istream& read(unsigned char *array, int numb);

выполняют чтение заданного количества numb символов в массив array.

Полезны следующие функции того же класса istream:

istream& seekg(long pos) ;

устанавливает позицию чтения из потока в положение, опре­деляемое значением параметра.

istream& seekg(long pos, seek_dir dir);

выполняет перемещение позиции чтения вдоль потока в на­правлении, определенном параметром dir, принимающим значения из перечисления enum seek_dir {beg, cur, end }. Относительная величина перемещения (в байтах) определяется значением параметра long pos. Если направление определено как beg, то смещение от начала потока; cur - от текущей по­зиции; end - от конца потока;

long tellg()

определяет текущую позицию чтения из потока.

Характеристики

Тип файла
Документ
Размер
1,23 Mb
Тип материала
Высшее учебное заведение

Список файлов лабораторной работы

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6518
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее