КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Файловый ввод- вывод с использованием потоков
Void main () { double x; cout.precision (4); cout.fill ('0'); cout << "x\tsqrt(x)\tх^2\n"; for (x = l.0; x<=6. 0; x++) { cout << setw (4) << x << ’\t’; cout << setw (6) << sqrt (x) << ’\t’; cout << setw (3) << x*x << ' \n '; } } Этот пример функционально полностью эквивалентен примеру, приведенному ранее, но для управления форматом вывода использует манипуляторы, а не функции форматирования. Для осуществления операций с файлами библиотека ввода-вывода предусматривает три класса: ifstream, ofstream и fstream. Эти классы являются производными, соответственно, от классов istream, ostream и iostream. Поскольку эти последние классы, в свою очередь, являются производными от класса ios, классы файловых потоков наследуют все функциональные возможности своих родителей (перегруженные операции << и >> для встроенных типов, функции и флаги форматирования, манипуляторы и пр.). Для реализации файлового ввода-вывода нужно включить в программу заголовочный файл <fstream.h>. Существует небольшое отличие между использованием предопределенных и файловых потоков. Файловый поток должен быть связан с файлом прежде, чем его можно будет использовать. С другой стороны, предопределенные потоки могут использоваться сразу после запуска программы, даже в конструкторах статических классов, которые выполняются даже раньше вызова функции main (). Вы можете позиционировать файловый поток в произвольную позицию в файле, в то время как для предопределенных потоков это обычно не имеет смысла. Для создания файлового потока эти классы предусматривают следующие формы конструктора: создать поток, не связывая его с файлом: explicit ifstream (); explicit ofstream (); explicit fstream (); создать поток, открыть файл и связать поток с файлом: explicit ifstream (const char*name, ios:: openmode mode = ios:: in); explicit ofstream (const char* name, ios:: openmode mode = ios:: out | ios:: trunc); explicit fstream (const char* name, ios:: openmode mode = ios:: in | ios:: out); Чтобы открыть файл для ввода или вывода, можно использовать вторую форму нужного конструктора fstream fs ("FileName.dat"); или вначале создать поток с помощью первой формы конструктора, а затем открыть файл и связать поток с открытым файлом, вызвав функцию-член ореn (). Эта функция определена в каждом из классов потокового ввода-вывода и имеет следующие прототипы: void ifstream:: open (const char*name, ios:: openmode mode = ios:: in); void ofstream:: open (const char* name, ios:: openmode mode = ios:: out | ios:: trunc); void fstream:: open (const char* name, ios:: openmode mode = ios:: in | ios:: out); Здесь name – имя файла, mode – режим открытия файла. Параметр mode является перечислением и может принимать следующие значения: ios:: in открыть файл для чтения; ios:: out открыть файл для записи; ios:: ate начало вывода устанавливается в конец файла; ios:: app скрыть файл для добавления в конец; ios:: trunc усечь файл, т.е. удалить его содержимое; ios:: binary двоичный режим операций. Режимы открытия файла представляют собой битовые маски, поэтому вы можете задавать два или более режима, объединяя их операцией ИЛИ. В следующем фрагменте кода файл открывается для вывода с помощью функции open (): ofstream ofs; ofs.open ("FileName.dat"); Обратите внимание, что по умолчанию режим открытия файла соответствует типу файлового потока. У потока ввода или вывода флаг режима всегда установлен неявно. Например, для потока вывода в режиме добавления файла можно вместо инструкции ofstream ofs ("FName.txt", ios:: out | ios:: app); написать следующую: ofstream ofs ("FName.txt", ios:: app); Между режимами открытия файла ios:: ate и ios:: app имеется небольшая разница. Если файл открывается в режиме добавления, весь вывод в файл будет осуществляться в позицию, начинающуюся с текущего конца файла, безотносительно к операциям позиционирования в файле. В режиме открытия ios:: ate (от англ, "at end") вы можете изменить позицию вывода в файл и осуществлять запись, начиная с нее. Для потоков вывода режим открытия эквивалентен ios:: out | ios:: trunc, то есть вы можете опустить режим усечения файла. Однако для потоков ввода-вывода его нужно указывать явно. Файлы, которые открываются для вывода, создаются, если они еще не существуют. Если открытие файла завершилось неудачей, объект, соответствующий потоку в булевом выражении, будет возвращать false: if (! osf) cout << "File not open\п"; Проверить успешность открытия файла можно также с помощью функции-члена is_open (), имеющей следующий прототип: bool is_open () const; Функция возвращает true, если поток удалось связать с открытым файлом. Например, if (! osf.is_open ()) cout << "File not open\п"; Если при открытии файла не указан режим ios:: binary, файл открывается в текстовом режиме и после того, как файл успешно открыт, для выполнения операций ввода-вывода можно использовать операторы извлечения и вставки в поток. Можно даже использовать функции ввода-вывода, принятые в языке C, такие, как fprintf () и fscanf (). Для проверки, достигнут ли конец файла, можно использовать функцію eof () класса ios, имеющую следующий прототип: bool eof () const; Завершив операции ввода-вывода, необходимо закрыть файл, вызвав функцию-член close (): ofs.close (); Функция close () не имеет параметров и возвращаемого значения: void close (); Закрытие файла происходит автоматически при выходе объекта потока из области видимости, корда вызывается деструктор потока. Рассмотрим пример перегрузки операторов извлечения и вставки в поток для определенного пользователем типа данных, которым является класс точки. Ввод-вывод можно осуществлять как в файл, так и на экран. Следующий пример демонстрирует эту возможность:
// peregcincout.cpp: Defines the entry point for the console application. //
#include "stdafx.h" #include <iostream> #include <fstream> using namespace std; class Dot { int x; int y; public:
int GetX(){return x;} void SetX(int _x){x=_x;} Dot(int _x,int _y){x=_x;y=_y;} friend ostream & operator<<(ostream &out, Dot &d); friend istream & operator>>(istream &in, Dot &d); }; ostream & operator<<(ostream &out, Dot &d) { out<<d.x<<' '<<d.y<<' '; return out; } istream & operator>>(istream &in, Dot &d) { in>>d.x>>d.y; return in; } int _tmain(int argc, _TCHAR* argv[]) { Dot d1(9,2),d2(8,7); ofstream out("t.txt",ios::app); out<<d1<<d2; out.close(); ifstream in("t.txt"); cout<<"\n read in file "; while(in>>d2,!in.eof()) //читаем до конца файла { cout<<'\n'<<d2; } system("pause"); return 0; }
Следует иметь в виду, что стандартная библиотека ввода-вывода отличается от традиционной. Этот факт нужно учитывать при переносе старых программ в современные системы программирования.
Дата добавления: 2014-01-04; Просмотров: 468; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |