- •Функции стандартного ввода/вывода
- •Примечание
- •Примечание
- •9.2.2 Ввод/вывод с использованием разных классов
- •Пространства имен
- •Работа с классом fstream
- •Is_open() — если файл открыт, то функция возвращает true, иначе - false;
- •Работа с классом ofstream
- •Работа с классом ifstream
- •Работа с бинарным файлом
- •Общие положения
- •Стандартный ввод cin
Работа с классом ofstream
Этот класс предназначен для организации работ по выводу (записи) в файл с помощью методов этого класса:
open() — открывает файл для записи в него информации;
is_open() — возвращает true, если файл открыт, и false — в противном случае;
put() — записывает в файл один символ;
write() — записывает в файл заданное число символов;
skeep() — перемещает указатель позиционирования в заданное место файла;
tellp() —выдает текущее значение указателя позиционирования;
close()—закрывает файл;
rdbuf () — выдает указатель на буфер вывода (этот буфер находится в структуре, с которой связывается файл при его открытии).
В листинге 9.11 приведен пример использования класса ofstream.
Листинг 9.11
#include <fstream>
ofstream FILE; /*объявляем переменную FILE типа ofstream (создаем экземпляр класса)*/
FILE.open("a.txt"); //вызываем метод открытия файла
if(FILE = NULL) return(0); //неудачное открытие файла
for(int i=0; i<2; i++)
FILE << "string " << i << endl; //вывод в файл
FILE.close(); //закрытие файла
Работа с классом ifstream
Этот класс предназначен для организации работ по вводу (чтению) из файла с помощью методов этого класса:
open() — открывает файл для чтения из него информации;
is_open () — возвращает true, если файл открыт, и false — в противном случае;
get() — читает из файла один символ;
read() — читает из файла заданное число символов;
eof() — возвращает ненулевое значение, когда указатель позиционирования достигает конца файла;
peek() — выдает очередной символ потока, но не выбирает его (не сдвигает указатель позиционирования данного в файле);
seekg() — перемещает указатель позиционирования в заданное место файла;
tellg() — выдает текущее значение указателя позиционирования;
close() — закрывает файл;
rdbuf() — выдает указатель на буфер ввода (этот буфер находится в структуре, с которой связывается файл при его открытии).
Пример использования класса приведен в листинге 9.12.
Листинг 9.12
#include <fstream>
ifstream FILE; /*объявляем переменную FILE типа ifstream (создаем экземпляр класса) */
char р[100];
FILE.open("a.txt"); //вызываем метод открытия файла
if(FILE ==NULL) return(0); //неудачное открытие файла
while (!FILE.eof()) //проверка на признак конца файла
{
FILE >> p; //чтение из файла
cout << р << endl; //вывод прочитанных данных на экран
}
FILE.close(); //закрытие файла
В листинге 9.13 приведен пример использования обоих классов: ofstream, ifstream (оба находятся в fstream), результат работы программы показан на рис. 9.9.
Листинг 9.13
// З9.срр : Defines the entry point for the console application.
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <conio.h>
#define DelKey 's' //этот символ будет удаляться из потока
#define maxline 1000
int _tmain(int argc, "char* argv[])
{
using namespace std; //используется стандартное пространство имен
//Проверка вывода
ofstream FILE;
FILE.open("c:\\a.txt", ios::out) ;
char p[maxline];
int i,pos;
for(i=0; i<2; i++)
FILE << "string " << i; /* << endl; endl вводить не надо, иначе цикл будет длиннее*/
FILE.close();
//Проверка ввода (чтения по записям)
ifstream FILE1;
FILEl.open("c:\\a.txt");
FILEl.seekg(0); /*указатель — в начало(он и так будет в начале, но это, чтобы посмотреть, как работает seekg())*/
if(FILE1 == NULL) //так надо проверять на ошибку открытия файла
return(0);
while(!FILE1.eof()) //так проверяется конец файла
{
FILE1 >> р >> i;
cout << p << i << endl;
}
FILEl.close();
_getch();
//Проверка посимвольного чтения
ifstream FILE2;
char с;
FILEa.open("c:\\a.txt");
if(FILE2 == NULL) //так проверять на плохое открытие
return(0);
while(!FILE2.eof()) //так проверяется конец файла
{
c=FILE2.peek(); /*смотрит, какой следующий символ будет считан, но указатель позиционирования при этом не сдвигается: остается на этом символе*/
streamoff cgp=FILE2.tellg(); /*так определяется текущая позиция в файле*/
if (c==DelKey) /*выбрасываются все символы DelKey из читаемого потока*/
{
pos= cgp + 1; // готовимся пропустить символ по seekg()
FILE2.seekg(pos); /*передвинули указатель позиционирования на один символ дальше, чтобы пропустить символ */
continue; //на продолжение цикла
}
FILE2.get(с); //чтение символа в с
cout << с;
} //while
cout << endl;
FILE2.close() ;
_getch() ;
System("DEL С:\\A.TXT"); //удаление рабочего файла
}//_tmain()
Рис. 9.9. Результат работы программы листинга 9.13