Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
umm_3690.pdf
Скачиваний:
24
Добавлен:
30.04.2015
Размер:
364.53 Кб
Скачать

Операция void *( ) неявно вызывается всякий раз, когда поток сравнивается с нулем. Это позволяет записывать циклы вида:

while (stream_obj) {

// Все в порядке, можно производить ввод/вывод

}

Файловые потоки

Стадартная библиотека содержит три класса для работы с файлами: ifstream – класс входных файловых потоков;

ofstream – класс выходных файловых потоков; fstream – класс двунаправленных файловых потоков.

Эти классы являются производными от классовistream, ostream и iostream соответственно.

Использование файлов в программе предполагает следующие операции:

создание потока;

открытие потока;

обмен (ввод/вывод);

уничтожение потока;

закрытие файла.

Каждый класс файловых потоков содержит конструкторы, с помощью которых можно создавать объекты этих классов различными способами.

Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом:

ifstream ( ); ofstream ( ); fstream ( );

Конструкторы с параметрами создают объект соответствующего класса, открывают файл с указанным именем и связывают файл с объектом:

ifstream (const char * name, int mode = ios :: in);

ofstream (const char * name, int mode = ios :: out | ios :: trunc); fstream (const char * name, int mode = ios :: in | ios :: out);

здесь второй параметр – это режим открытия файла.

Открыть файл в программе можно с использованием либо конструкторов, либо метода open, имеющего такие же параметры, как и в соответствующем конструкторе.

Пример 1

ifstream inpf ("input.txt"); // используем конструктор

if (! inpf) {

cout << "Невозможно открыть файл для чтения";

return 1;

}

44

Пример 2

ofstream f;

f.open ("output.txt", ios :: out); //используем метод open

if (!f) {

cout << “Невозможно открыть файл для записи”;

return 1;

}

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

Пример. Вывод на экран содержимого файла.

# include <fstream.h>

int main ( ) {

char text [81], buf [81];

cout << "Введите имя файла";

cin >> text;

ifstream f (text);

if (!f) {

cout << "Ошибка открытия файла";

return 1;

}

while (!f.eof ( )) {

f.getline (buf,81);

cout << buf << endl;

}

return 0;

}

Для закрытия потока определен методclose ( ), но поскольку он неявно выполняется деструктором, явный вызов необходим только тогда, когда требуется закрыть поток раньше конца его области видимости.

45

Задание

Перепишите вашу программу – телефонный справочник с использованием файловых потоков и форматированного ввода-вывода.

Строковые потоки

Строковые потоки позволяют считывать и записывать информацию из областей оперативной памяти так же, как и из файла, с консоли или на дисплей.

В стандартной библиотеке определено три класса строковых потоков: istringstream – входные строковые потоки;

ostringstream – выходные строковые потоки; stringstream – двунаправленные строковые потоки.

Эти классы определены в заголовочном файле <sstream> и являются производными от классов istream, ostream и iostream соответственно.

Участки памяти, с которыми выполняются операции чтения и извлечения, по стандарту определяются как строки С++ (класс string). Строковый класс будет рассмотрен далее. Строковые потоки создаются и связываются с этими участками памяти с помощью конструкторов:

explicit istringstream (int mode = ios :: in);

explicit istringstream (const string & name, int mode = ios :: in); explicit ostringstream (int mode = ios :: out);

explicit ostringstream (const string & name, int mode = ios :: out); explicit stringstream (int mode = ios :: in | ios :: out);

explicit stringstream (const string & name, int mode = ios :: in | ios :: out);

Здесь слово explicit указывает на то, что эти конструкторы вызываются только явным образом.

В строковых потоках описан метод str, возвращаюший копию строки или устанавливающий ее значение:

string str ( ) const;

void str (const string & S);

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

#include <sstream>

#include <string>

#include <iostream>

#include <ctime> using namespace std; string message (int i) { ostringstream os; time_t t;

time (&t); // Функция возвращает текущие дату и время в виде time_t

46

os << "time: " << ctime (&t) <<"number: " << i << endl; return os.str ( );

//Функция ctime () превращает время

//в строку

}

int main ( ) {

cout << message (22); return 0;}

47

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]