- •Функции стандартного ввода/вывода
- •Примечание
- •Примечание
- •9.2.2 Ввод/вывод с использованием разных классов
- •Пространства имен
- •Работа с классом fstream
- •Is_open() — если файл открыт, то функция возвращает true, иначе - false;
- •Работа с классом ofstream
- •Работа с классом ifstream
- •Работа с бинарным файлом
- •Общие положения
- •Стандартный ввод cin
9.2.2 Ввод/вывод с использованием разных классов
Как, мы определили, что поточные классы — это поставщики инструментов для работы с файлами.
В поточных классах хранятся:
структуры, обеспечивающие открытие/закрытие файлов;
функции (методы) открытия/закрытия файлов;
другие функции и данные, обеспечивающие, как мы увидим далее, собственно ввод/вывод.
Пространства имен
Многие серьезные приложения состоят из нескольких программных файлов (с исходным текстом программ), которые создаются и обслуживаются отдельными группами программистов. И только после этого все файлы собираются в общий проект. Но как быть с тем фактом, что в таких файлах могут быть одинаково объявлены некоторые разные переменные? В C++ это неудобство разрешается с помощью так называемых пространств имен, которые вводятся в каждый составляющий единый проект текстовый программный файл с помощью директивы:
Namespace <имя пространства имен (идентификатор)> {в эти скобки заключается весь программный текст}
Когда идет сборка общего проекта, то в итоговом тексте пишут директиву:
using namespace:: идентификатор пространства имен;
Это обеспечивает в итоговом проекте доступ к переменным файла с данным пространством имен. При использовании поточных классов языка C++ в основной программе требуется писать директиву:
using namespace::std;
В противном случае программа не пройдет компиляцию. В листинге 9.9 приводится пример использования директив пространства имен, результат работы программы показан на рис. 9.7.
Листинг 9.9
// З7.срр : Defines the entry point for the console application.
#include "stdafx.h"
#include <iostream>
#include <conio.h>
namespace F
{
float x = 9;
}
namespace G
{
using namespace F; /*здесь само пространство G использует пространство F и в нем же объявляется еще одно пространство: INNER_G*/
float у = 2.0;
namespace INNER_G
{
float z = 10.01;
}
} //G
int _tmain()
{
using namespace G; /*эта директива позволяет пользоваться всем, объявленным в "G"*/
using namespace G::INNER_G; /*эта директива позволяет пользоваться всем, объявленным только в "INNER_G"*/
float x = 19.1; /*локальное объявление переопределяет предыдущее*/
std::cout << "х = " << х << std::endl;
std::cout << "у = " << у << std::endl; /* у берется из пространства F*/
std::cout << "z = " << z << std::endl; /* z берется из пространства INNER_G*/
_getch();
}
/*Результат:
x = 19.1
y=2
z=10.1
*/
Рис. 9.7. Результат работы программы листинга 9.9
std::cout — это стандартный вывод. Его мы рассмотрим чуть позже. Здесь показано, что объект cout принадлежит пространству имен std. Мы могли I бы в основной программе записать:
using namespace::std;
Тогда бы вместо std:: cout можно было бы писать просто cout.
Итак, при составлении программы с использованием поточных файлов в начале основной программы следует записать директиву:
using namespace std;