4 (Методические указания к лабораторным работам ИУ), страница 3

2018-01-11СтудИзба

Описание файла

Документ из архива "Методические указания к лабораторным работам ИУ", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "информатика" в общих файлах.

Онлайн просмотр документа "4"

Текст 3 страницы из документа "4"

имя_класса(int fd);

создает поток и присоединяет его к уже открытому файлу, де­скриптор которого используется в качестве параметра fd;

имя_класса(int fd, char *buf, int);

создает поток, присоединяя его к уже открытому файлу с де­скриптором fd, и использует явно заданный буфер (параметр buf);

имя_класса(char *FileName, int mode, int = ...);

создает поток, присоединяет его к файлу с заданным именем Filename, а при необходимости предварительно создает файл с таким именем.

Детали и особенности перечисленных конструкторов лучше изучать по документации конкретной библиотеки ввода-вывода.

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

ifstream fi; //Создает входной файловый поток fi

ostream fo; // Создает выходной файловый поток fo

fstream ff; // Создает файловый поток ввода-вывода ff

После выполнения каждого из этих конструкторов файловый поток можно присоединить к конкретному файлу, используя уже упомянутую компонентную функцию open () :

void open (char*FileName, int режим, int защита);

Примеры:

fi.open ("Filel.txt",ios::in); // Поток fi соединен с файлом Filel.txt

fi.close(); //Разорвана связь потока fi с файлом Filel.txt fi.open("File2.txt"); //Поток fi присоединен к файлу File2.txt

fo.open("NewFile"); // Поток fo присоединяется к файлу NewFile; если такой файл //отсутствует - он будет создан

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

Примеры:

ifstream flowl ("File.l");

создает входной файловый поток с именем flowl для чтения данных. Разыскивается файл с названием File.l. Если такой файл не существует, то конструктор завершает работу аварийно. Проверка:

if (!flowl) cerr << "Не открыт файл File.l!";

ofstream flow2 ("File.2");

создается выходной файловый поток с именем flow2 для за­писи информации. Если файл с названием File.2 не су­ществует, он будет создан, открыт и соединен с потоком f low2. Если файл уже существует, то предыдущий вариант бу­дет удален и пустой файл создается заново. Проверка:

if (!flow2) cerr << "Не открыт файл File.2!";

fstream flow3("File.3");

создается файловый поток fiow3, открывается файл File.3 и присоединяется к потоку flow3.

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

В качестве иллюстрации основных особенностей работы с файла­ми рассмотрим несколько программ.

//Чтение текстового файла с помощью onepaции >>

#include <stdlib.h> // Для функции exit()

#include <fstream.h> // Для файловых потоков

const int lenName = 13; // max длина имени файла

const int lenString = 60; // Длина вспомогательного массива

void main()

{

char source[lenName]; // Массив для имени файла

cout << "\nВведите имя исходного файла: ";

cin >> source;

ifstream inFile; // Входной файловый поток

// Открыть файл source и связать его с потоком inFile:

inFile.open(source);

if (!inFile) // Проверить правильность открытия файла

{ cerr « "\nОшибка при открытии файла " << source;

exit(1); // Завершение программы

}

// Вспомогательный массив для чтения:

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, то чтение прекращается как при появлении ограничивающего символа.

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