Студопедия

КАТЕГОРИИ:


Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.