Главная страница

ООП. Пособие по ООП в С++. Создание сложных программных систем Объектно ориентированная технология


Скачать 2.1 Mb.
НазваниеСоздание сложных программных систем Объектно ориентированная технология
Дата21.02.2022
Размер2.1 Mb.
Формат файлаpdf
Имя файлаПособие по ООП в С++.pdf
ТипАнализ
#369034
страница12 из 15
1   ...   7   8   9   10   11   12   13   14   15
Стандартные потоки
Заголовочный файл помимо описания классов для ввода/вывода содержит четыре предопределенных объекта (табл.2).
Таблица 2 Предопределенные объекты
Объект
Класс
Описание cin istream
Связывается с клавиатурой
(стандартным буферизованным вводом) cout ostream
Связывается с экраном
(стандартным буферизованным выводом) cerr ostream
Связывается с экраном (стандартным не буферизованным выводом), куда направляются сообщения об ошибках clog ostream
Связывается с экраном
(стандартным буферизованным выводом), куда направляются сообщения об ошибках
14 Файловые потоки
Файл – это структура хранения данных на внешнем носителе. В языках программирования представлен аппарат для обработки данных, хранящихся в файлах.
В языке С++ имеется встроенный аппарат для работы с текстовыми и двоичными файлами.
В С++ аппарат работы с файлами основан на объектах классов , хранящихся в файлах ostream и istream, fstream.
Класс файловых потоков – это иерархия, базовым классов этой иерархии является абстрактный класс с именем ios, который находится на вершине иерархии. Он используется только в качестве базового класса для остальных потоков ввода-вывода.
Поток – это логический интерфейс к файлу.
Класс ios содержит единственный открытый конструктор потока, для использования которого требуется иметь предварительно созданный объект типа streambuf, обеспечивающий возможности буферизованного ввода или
вывода. В большинстве случаев намного удобнее воспользоваться производными от ios классами, которые обеспечивают более простой интерфейс для создания потоковых объектов и предоставляют дополнительную функциональность, адаптированную к задачам ввода или вывода данных.
При работе с потоковой библиотекой ввода-вывода программист обычно достаточно активно использует следующие классы:

istrstream - класс входных строковых потоков;

ostrstream - класс выходных строковых потоков;

strstream - класс двунаправленных строковых потоков (ввода-вывода);

ifstream - класс входных файловых потоков;

ofstream - класс выходных файловых потоков;

fstream - класс двунаправленных файловых потоков (ввода-вывода);

constream - класс консольных выходных потоков.
14.1
Виды файлов
1) Текстовый
Это последовательность символов ASCII. Можно создать текстовым редактором или программой.
2) Двоичный
Создается только программно, содержит значения ячеек переменных, которые были записаны в файл.
14.2
Физический и логический файлы
Физический файл это: файл с данными на внешнем носителе, устройство ввода (консоль), устройство вывода, порт ввода и вывода.
Логический файл: это переменная (объект), представляющая физический файл в программе.
Для доступа к элементам файла, в программе следует объявить файловую переменную. В С++ логический файл называют файловым потоком – это объект класса потока. Этот класс предоставляет интерфейс для управления файлом.
14.3
Классы основных файловых потоков
ifstream – класс входных файловых потоков ( для чтения данных) ofstream – класс выходных файловых потоков (для создания файлов и добавления записей)
fstream – класс двунаправленных потоков (для обеих типов операций)
14.4
Буферизированный ввод и вывод
При открытии файла для чтения или записи с ним связывается буфер - это участок оперативной памяти. Буфер предназначен для ускорения выполнения операций обмена данными, между медленным устройством
(диск) и более быстрым – оперативная память
Буфер
Оперативная память
Файл данных
Чтение
Запись
Чтение – порция данных в объеме буфера считывается в буфер, затем из буфера данные считываются в соответствии с командой чтения и ее переменными. После чтения всех загруженных в буфер данных, если еще чтение продолжается, считывается новая порция и так пока все данные не прочитаются.
Записьданные, которые записываются в файл, сначала накапливаются в буфере, как только буфер заполниться, его содержимое переписывается в файл. Если буфер не заполнен, то данные будут переписаны в файл: при закрытии файла или вытолкнуты принудительно методом flush или при завершении программы.
14.5
Открытие потока (файла)
Открытие потока (файла) означает: разрешить доступ к данным связанного с потоком физического файла. Физически открытие файла означает следующее – устройство чтения (записи) диска подводиться системой к месту размещения файла на диске и останавливается перед первой, или последней или заданной записью файла в зависимости от режима открытия. При открытии с потоком связывается буфер потока.
14.6
Закрытие потока (файла)
Операция, отключающая поток от файла. Это операция, которая закроет доступ к данным открытого файла. При этом физически читающее устройство будет отведено от файла, но связь файла с потоком не будет разорвана. Если
закрывается файл, открытый для записи, то все содержимое буфера вывода будет переписано в файл.
14.7
Управление текстовым файлом
Тестовый файл – это последовательность символов, сохраненная на внешнем носителе. Текстовый файл может быть создан текстовым редактором кодировки ASCII и средствами программы.
Под управлением понимают операции над данными файла:
• Чтение данных из файла
• Запись данных в файл
• Изменение данных в файле
• Открытие файла
• Закрытие файла
• Добавление данных в файл
14.7.1 Создание потока
Для управления данными физического файла в программу необходимо:
• определить объект определенного файлового потока: если из файла собираемся читать – то создаем входной поток (класса ifstream); если собираемся создавать файл из программы или добавлять новые записи (можно только в конец) – создаем выходной поток (класса ofstream);
• связать поток с физическим файлом (инициализировать объект).
Пример. Создание потока конструктором без параметров
Такой поток представляет переменную, которая не связана с каким – то физическим файлом. ifstream if; // if - поток для ввода данных в файл ostream of; // of - для чтения данных из файла fstream ff; // ff - для чтения и записи
14.7.2 Связывание потока с физическим файлом
После связывания поток представляет файл в программе. Связывание потока с файлом осуществляется при открытии потока.
1) Создание, открытие и связывание потока с файлом при инициализации объекта ifstream if(“A.txt”);//поток if указывает на файл A.txt, который расположен в папке проектa. Поток if связан с файлом, открытым для чтения. ofstream of(“A.txt”);// Поток of связан с файлом, открытым для записи. fstream ff(“A.txt”);
2)
Метод открытия файла потока - open

Так как поток это объект класса, то открытие можно выполнить методом
open.
Формат метода:
open([имя файла,] [способ открытия файла])
имя файластроковое значение или переменная типа строка, которое задает имя физического файла.
Способ открытия файла – режим открытия файла, задается перечисляемой переменной enum open_mode(app, binary, in, out, trunc, ate),
которая определена в базовом классе ios. Так как классы ifstream, ofstream, fstream являются производными от класса ios, то при определении экземпляра одного из потоковых классов, обращение к значениям перечисяемой переменной должно идти с указанием класса родителя: ios::app, или ios::in,
или ios:out и т.д.
Назначения констант перечисления:
app – открыть существующий файл для записи в конец; (указатель в конец)
out - открыть файл для создания и записи в начало (указатель на первую запись);
in - открыть файл для чтения из файла с первой записи (указатель на первую запись)
trunc – очистить файл, если он существует
ate - переместить указатель на конец файла.
При открытии файла можно задавать несколько режимов открытия в одной строке, в этом случае режимы разделяются символом | .
f.open(“F.txt”,ios::out|ios::binary|ios::trunс ) – открыть двоичный
файл для записи и если он существует очистить содержимое файла
Пример 1. Открытие файла методом open для чтения данных из файла
Открыть текстовый фай А.txt для записи
1)
при создании файлового потока конструктором ofstream f.open(“A.txt”); //по умолчанию для записи ofstream f.open(“A.txt”, ios::in); //явно, с указанием соответствующего режима
2)
после создания файлового потока ofstream f; f.open(“A.txt”);
Пример 2. Создание текстового файла программой.
Открытие файла методом open для чтения данных из файла
1)
при создании файлового потока конструктором
ifstream f.open(“A.txt”); //по умолчанию для записи ifstream f.open(“A.txt”, ios::out|ios::trunc);
//явно, с указанием соответствующего режима
2)
после создания файлового потока ifstream f; f.open(“A.txt”, ios::trunc);
Пример 2. Модификация текстового файла программой.
Открытие файла методом open для добавления данных в конец файла.
Требования: файл должен существовать.
1) при создании файлового потока конструктором ofstream f.open(“A.txt”, ios::app); //явно, с указанием соответствующего режима
2) после создания файлового потока ofstream f; f.open(“A.txt”, ios::app);
14.7.3
Закрытие файлового потока
Прекращается доступ к данным.
Закрытие файла осуществляет метод осуществляется методом сlose().
Формат вызова метода закрытия файла
Имя потока.close()
Пример. Открытие файлового потока для чтения и закрытие int main()
{ ofstream f; f.open(“A.txt”);
// обработка файла f.close();
}
14.7.4
Проверка существования файла
Биты ошибок при обработке файла badbit – устанавливается в случае катастрофической ошибки failbit - устанавливается в случае восстанавливаемой ошибки eofbit – устанавливается, если достигнут конец файла (это не обязательно ошибочная ситуация)
Функции получения значений состояний bool bad() const возвращает true если установлен badbit bool eof() const возвращает true если установлен eofbit bool fail() const возвращает true если установлен failbit
bool good() const возвращает true если не установлен ни один бит iostate rdstate() const – возвращает битовую маску, ассоциированную с потоком.
Примеры использования битов потоков для проверки существования файлов и их состояния
Способ 1. (Чаще всего применяется). Применение операции
!
имяпотока к файловому потоку вернет результат вызова функции fail(), которая проверяет состояние бита failbit, в который записывается результат открытия файла. int main()
{ ofstream f(“A.txt”); if(!f)
//проверка открытия потока
{ сout<<”файл не открыт”; return1;
}
// обработка файла f.close();
}
Способ 2. Метод fail().
Проверяет состояние флага failbit, если не открылся, то метод fail().вернет true.
int main()
{ ofstream f; f.open(“A.txt”); if(f.fail())
{ сout<<”файл не открыт”; return1;
}
// обработка файла f.close();
}
Способ 3. Метод is_open()
Метод is_open() позволяет проверить, открыт ли файл. Т.е. метод
is_open() – возвращает true , если файл открыт.
Пример использования метода int main()
{ ofstream f; f.open(“A.txt”);
if(!f.is_оpen())
{ сout<<”файл не открыт”; return1;
}
// обработка файла f.close();
}
14.7.5 Операция и методы записи данных в текстовый файл
Чтобы создать текстовый файл программно, надо создать поток ofstream и открыть его с указанием имени создаваемого файла. При открытии надо обязательно проверить существование файла, чтобы случайно его не стереть существующий, ведь при открытии существующего файла для записи информация существующего файла будет потеряна.
Для записи в файл данных используется операция записи в поток << или методы потока.
При записи данных в текстовый файл данные автоматически преобразуются в символьный формат. Например, при выводе в текстовый файл числа целого числа 123, число, которому достаточно одного байта в памяти, будет представлено в файле тремя символами, т.е займет в файле три байта.
Текстовые файлы называют форматированными, так как подготовленные в них данные должны быть подготовлены так, чтобы их можно было корректно прочитать. Например, числовые данные должны быть отделены друг от друга хотя бы одним пробелом, а символы должны следовать друг за другом, в конце строки может находиться символ конца строки.
Помещение записи в поток
Операция помещения в поток <<. Аналогично помещению в поток cout.
Пример. ofstream o(“A.txt”, ios::trunc); int x; o<Пример. Создание текстового файла с именем A.txt и запись в текстовый (форматированный файл). Запись в файл двух целых чисел, числа располагаются в отдельных строках.
#include
"stdafx.h"
#include

#include

using namespace std; int
_tmain(
int argc, _TCHAR* argv[])
{ ofstream f; f.open(
"A.txt"
); if
(!f.is_open())
//проверка существования файла с именем A.txt
{ cout<<
"файл не открыт"
; return
1;
}
//запись в файл двух строк f<<
"Текст записывается в файл А.txt"
<' '
<<125<<
'\n'
;
// обработка файла f.close(); return
0;}
14.7.6 Методы для управления ошибками потоков
В базовом классе ios определено поле state, которое хранит состояние потока в виде совокупности битов. Каждая совокупность отвечает за определенное состояние. Для доступа к состоянию используются методы потока.
Прототип метода
Описание действия int rdstate() возвращает текущее состояние потока int eof() результат 0, если не достигнут конец файла int fail() результат 0, если ошибка: при форматировании (флаг failbit=1), или от неисправности оборудования
(hardfail), или серьезная ошибка в потоке(badbit=1) int bad() результат 0, если ошибка: при форматировании или от неисправности оборудования int good()
Проверка результатов операций ввода-вывода. результат 0, если
флаги ошибок failbit, badbit, hardfail сброшены в 0 void cleare(int =0) очистить флаг состояния operator void*() результат NULL, если установлен хотя бы один бит ошибки operator !() результат not NULL, если установлен хотя бы один бит ошибки
14.7.7
Функции и методы чтения данных из файла
• Фунция – getline
Формат метода
int getline (поток чтения, переменная)
• Перегруженная операция извлечения из потока >>
Пример чтения из файла, созданного текстовым редактором
Пусть текстовый файл подготовлен текстовым редактором и хранит информацию на трех отдельных строках в файле (в конце строки стоит символ конца строки).
Герберт Шилдт
С++ методика программирования Шилдта
2009
Задача.
Прочитать Герберт Шилдт в переменную Fam;
Прочитать С++ методика программирования Шилдта в переменную NameBook/
Прочитать 2009 в переменную числового типа year.
#include
"stdafx.h"
#include
"iostream"
#include
"istream"
#include
using namespace std; int
_tmain(
int argc, _TCHAR* argv[])
{ ifstream fin(
"B.txt"
); if
(!fin)

{ cout<<
"No open file"
; return
1;
} string Fam; string NameBook; int year;
getline(fin,Fam);//чтение текста с пробелами
getline(fin,NameBook);//чтение текста с пробелами fin>>year; //чтение числа return
0;
}
14.7.8
Использование функций проверки ошибок потоков
Пример использования методов управления ошибками
1) Методы good(), eof()
Запись данных в не открытый файл int
_tmain(
int argc, _TCHAR* argv[])
{ ifstream fin(
"C.txt"
); if
(!fin)
{ cout<<
"No open file"
; return
1;
} int
N; string str; char ch; double x; while
(!fin.eof())
{ fin>>N; fin>>str; fin>>ch; fin>>x; cout<' '
<' '
<' '
<} ofstream of;
of<<
"file no open"
<(!of.good())
{ cout<<
"No open file"
; system(
"pause"
); return
1;
} ifstream fin1("C.txt",ios::out|ios::trunc);//очистили файл if(fin1)
{ fin1>>str;
} if(!fin1.good())
{ cout<<"file is FULL"; system("pause"); return 1;
} fin1.close(); return
0;
}
Результат
14.7.9 Чтение данных из текстового файла
Текстовый файл хранит информацию в понятном человеку формате, в отличие от двоичных файлов. Поэтому их называют форматированными.
Чтение осуществляется:
• операцией выбора из потока>>
• функцией getline текста с пробелами между словами

• методами потока: get()
Методы для чтения из потока класса ifstream
gcount() get(char &c)
Чтение символа в переменную с get(char *buf, streamsize num)
Чтение строковых данных из файла
Чтение символа в массив символов buf, пока не будет прочитано num-1 символов, или найден символ новой строки ли конец файла. Символ новой строки из потока
не
извлекается. getline(char *buf, streamsize num)
Чтение строковых данных из файла
Чтение символа в массив символов buf, пока не будет прочитано num-1 символов, или найден символ новой строки ли конец файла. Символ новой строки из потока извлекается из потока но в buf не записывается.
Символ новой строки остается в буфере до следующего чтения. ignore(buf, num, lim=’\n’)
Считывает и пропускает num символов или встретит символ, указанный параметром lim. peek()
Возвращает следующий символ, без удаления его из потока, либо EOF
1   ...   7   8   9   10   11   12   13   14   15


написать администратору сайта