которая определена в базовом классе ios.
Так как классы ifstream,ofstream, fstream являются производными от класса ios, то при определении экземпляра одного из потоковых классов, обращение к значениям перечисяемой переменной должно идти с указанием класса родителя: ios::app, или ios::in, или ios:out и т.д.
Назначения констант перечисления:
App – открыть файл для записи в конец
Out - открыть файл для создания и записи в начало (указатель на первую запись)
In - открыть файл для чтения из файла с первой записи (указатель на первую запись)
Binary – открыть файл как двоичный (читаем структуры такого же размера как и записали)
Trunc – очистить файл, если он существует
Ate - переместить указатель на конец файла.
При открытии файла можно задавать несколько режимов открытия в одной строе, в этом случае режимы разделяются символом |.
open(“F.txt”,ios::out|ios::binary|ios::trunk)
Другие методы для работы с файлом
сlose() - закрытие файла;
is _ open () – если файл открыт, то возвращает true
rdbuf () – возвращает указатель на буфер ввода – вывода.
|
|
Поток открывается в определенном режиме, для чтения, записи, или обеих операций.
Флаги для способов открытия файла через объект ios Примечание. Для экземпляров класса ifstream может быть опущен режим ios::in, а для ofstream режим ios::out. | |||||
binary | in | out | trunc | app | |
Запись(w) | * | ||||
Добавление в конец(a) | * | * | |||
Запись с отсечением(w) | * | * | |||
Чтение ® | * | ||||
Чтение и запись (r+) | * | * | |||
Запись, чтение, отсечение(w+) | * | * | * | ||
Запись(wb) | * | * | |||
Добавление в конец(ab) | * | * | * | ||
Запись с отсечением(wb) | * | * | * | ||
Чтение(rb) | * | * | |||
Чтение и запись(r+b) | * | * | * | ||
Запись, чтение, отсечение(w+b) | * | * | * | * |
Способ 1.
1) ifstream if;
if.open(“A.txt”); // по умолчанию для чтения
2) ostream of;
of.open(“A.txt”); // по умолчанию для записи
3) ifstream ff
ff.open(“A.txt”); по умолчанию для записи и чтения
Способ2.
1) ifstream if(“A.txt”, ios::in|ios::trunc); для записи
2) ofstream o(“A.txt”, ios::out|ios::trunc); для чтения
3) ifstream ff(“A.txt”, ios::in| ios::out); для модификации
1.2.3. Ввод – вывод потоковый
Методы обмена с потоками
1) Операция извлечения из потока >>. Аналогично извлечению из стандартного потока cout.
Пример.
ofstream o(“A.txt”, ios::out|ios::trunc);
int x;
o>>x;
2) Операция включения в поток<<. Аналогично включению в стандартный поток cin.
ifstream if(“A.txt”, ios::in|ios::trunc);
int x=10;
if<<x;
3) Методы для чтения из потока класса istream
gcount() | |
get(c) | |
get(buf, num, lim=’\n’) | |
getline(buf, num, lim=’\n’) | |
ignore(buf, num, lim=’\n’) | |
peek() | |
putbuck (c) | |
read(buf,num) | |
readsome(buf,num) | |
seekg(pos) | |
seekg(offs, org) | |
tellg() | |
unget() |
4) Методы неформатированного вывода класса ostream
|
|
flush() | |
put(c) | |
seekg(pos) | |
seekg(offs, org) | |
tellg() | |
write(buf,num) | |
1.2.4. Закрытие файла
ofstream o(“A.txt”, ios::out|ios::trunc);
int x;
if>>x;
if.close(); //закрытие
1.3. Методы для управления ошибками потоков
В базовом классе ios определено поле state, которое хранит состояние потока в виде совокупности битов. Каждая совокупность отвечает за определенное состояние. Для доступа к состоянию используются методы потока.
Прототип метода | Описание действия |
int rdstate() | текущее состояние потока |
int eof() | результат 0, если не достигнут конец файла |
int fail() | результат 0, если ошибка: при форматировании (флаг failbit=1), или от неисправности оборудования (hardfail), или серьезная ошибка в потоке(badbit=1) |
int bad() | результат 0, если ошибка: при форматировании или от неисправности оборудования |
int good() | результат 0, если флаги ошибок failbit, badbit, hardfail сброшены в 0 |
void cleare(int =0) | очистить флаг состояния |
operator void*() | результат NULL, если установлен хотя бы один бит ошибки |
operator!() | результат not NULL, если установлен хотя бы один бит ошибки |
1.4. Форматирование данных
Способ 1. Флаги
В классе ios имеется поле long х_Flags, отдельные биты которого являются значениями флагов.
Флаги форматирования
Флаг | Положение бита | Описание действия флага при установке бита |
left | 0х0002 | выравнивание по левому краю |
right | 0х0004 | выравнивание по правому краю |
dec | 0х0010 | десятичная система счисления |
hex | 0х0040 | шестнадцатеричная система счисления |
uppercase | 0х0200 | символы верхнего регистра |
showpos | 0х0400 | выводить знак для положительных чисел |
scientific | 0х0800 | выводить в формате с плавающей точкой |
fixed | 0х1000 | выводить в форме с фиксированной точкой |
Методы установки значений флагов
Прототип метода | Описание действия |
long ios::flags(long) | присваивает флагам значение параметра Пример. Выводить в 16 системе, буквами верхнего регистра long a=27,b=11; cout.flags(ios::hex|ios::showbase|ios::uppercase); cout<<a<<’ ’<<b; Результат: 0Х1B 0ХB |
long ios::setf(long, long) | присваивает флагам, биты которых установлены в первом параметре значение соответствующих битов второго параметра |
long ios::setf(long) | устанавливает флаги, биты которых установлены в параметре |
Способ 2. Поля и методы форматирования класса ios
Поля класса ios для форматирования вывода
Поле | Применение |
int х_width | минимальная ширина поля ввода |
int precision | количество цифр в дробной части |
int x_fill | символ заполнения поля ввода |
Методы управления полями форматирования
Метод | Результат метода |
int ios::width() | ширина поля |
int ios::width(int) | установка размера поля вывода Пример 1. long a=27,b=11; cout.width(7); cout.flags(ios::hex|ios::showbase|ios::uppercase); int w=cout.width(); //перед выводом берем значение поля х_width cout<<a<<' '<<b; cout<<"w="<<w; Результат: w=7 Пример 2. long a=27,b=11; cout.width(7); cout.flags(ios::hex|ios::showbase|ios::uppercase); cout<<a<<' '<<b; int w=cout.width();//после вывода берем значение поля х_width cout<<"w="<<w; Результат: w=0 так как этот флаг применяется к одному выводу и сразу сбрасывается |
int ios:: precision() | размер точности для вывода вещественных чисел |
int ios:: precision(int) | устанавливает размер точности при выводе вещественных чисел |
char fill() | символ установленный для заполнения |
char fill(char) | устанавливает символ заполнения Пример. Заполнение пустых байтов в числе нулями cout.width(7); cout.flags(ios::hex|ios::showbase|ios::uppercase); int w=cout.width(); cout.fill('0'); cout<<a; cout<<"w="<<w; Вывод в 7 позиций значения 0Х1B, т.е. недостающие заполнятся нулями Результат. 0000Х1B |
Способ 3. Манипуляторы
Это функции, которые можно включать в цепочку операторов << и >>.
Функция | Описание |
dec | при вводе и выводе устанавливает флаг десятичной системы |
hex | при вводе и выводе устанавливает флаг шестнадцатеричной системы |
endl | при выводе включает в поток символ новой строки и выгружает буфер |
ends | при выводе включает в поток нулевой символ |
flush | при выводе выгружает буфер |
Пример. cout<<27<<’ ‘<<hex<<27<<endl; cout<<flush; |
1.5. Пример.Операции с текстовым файлом.
|
|
#include "stdafx.h"
#include "fstream"
#include "iostream"
using namespace std;
//создание текстового файла
//Структура файла: в строке одно число,
//строка завершается символом конца строки
void inpfiletxt(ofstream &fout,char *namefile)
{
fout.open(namefile,ios::out|ios::trunc);
for(int x=1;x<=10;x++)
{
fout<<x<<endl;
}
fout.close();
}
//вывод содержимого текстового файла
//чтение числа и символа конца строки
//чтобы обработать до конца файла
void outfiletxt(char *namefile)
{int x;
ifstream fin;
cout<<endl;
fin.open(namefile,ios::in);
while(!fin.eof())
{
fin>>x;
fin.get();
cout<<x;
}
fin.close();
}
//добавление записи в конец файла
void appfiletxt(ofstream &fout,char *namefile,int x)
{
fout.open(namefile,ios::out|ios::app);
fout<<x;
fout.close();
}
//прочитать запись по заданному номеру
void seekNtextfile(char *namefile,int n)
{ int x;
ifstream fin;
fin.open(namefile,ios::in);
int i;
for (i=1;(i<n && (!fin.eof()));i++)
{
fin>>x;
fin.get();
}
cout<<endl;
while(!fin.eof()&& (i==n))
{
fin>>x;
fin.get();
cout<<x;
i++;
}
fin.close();
}
int _tmain(int argc, _TCHAR* argv[])
{ ofstream fout;
inpfiletxt(fout,"A.txt");
ifstream fin;
outfiletxt("A.txt");
appfiletxt(fout,"A.txt",100);
outfiletxt("A.txt");
seekNtextfile("A.txt",4);
cin.get();
return 0;
}
1.6. Пример. Операции с двоичным файлом
#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "string"
using namespace std;
//структура записи в двоичном файле
struct record
{int key;
char info[10];
};
void create(char *namefile);
void vivod(char *namefile);
void Append(char *namefile);
void ChengeRecord(int key,char *namefile);
int main(int argc, char* argv[])
{char *namefile="bin.dat";
cout<<"Create file"<<endl;
create(namefile);
cout<<"Show file"<<endl;
vivod(namefile);
cout<<endl;
cout<<"Append new file"<<endl;
Append(namefile);
vivod(namefile);
cout<<endl;
cout<<"update first record"<<endl;
ChengeRecord(0,namefile);
vivod(namefile);
cin.get();
cin.get();
return 0;
}
//добавление новой записи в конец вайла
void Append(char *namefile)
{ ofstream fout(namefile,ios::out|ios::app|ios::binary);
record r;
int l;
cout<<"key=";
cin>>r.key;
cout<<"info";
cin>>r.info;
l=strlen(r.info);
r.info[l-1]='\0';
fout.write((char *) &r, sizeof r);
}
//создание файла из трех записей
|
|
void create(char *namefile)
{
ofstream fout(namefile,ios::binary|ios::out);
record r;
int l;
for(int i=0;i<3;i++)
{ cout<<"key=";
cin>>r.key;
cout<<"info";
cin>>r.info;
l=strlen(r.info);
r.info[l-1]='\0';
fout.write((char *) &r, sizeof (r));
cin.get();
}
fout.flush();
fout.close();
}
//чтение файла пока указатель не станет 0
void vivod(char *namefile)
{ ifstream fin(namefile,ios::binary|ios::in);
record r;
while (fin.read((char *) &r, sizeof r))
{cout<<'\n';
cout<<r.key<<' ';
cout<<r.info<<' ';
}
fin.close();
}
//изменение записи с заданным номером двустороннем потоке
void ChengeRecord(int pos,char *namefile)
{ fstream fdirect(namefile,ios::binary|ios::out|ios::in);
record r;
fdirect.seekg(pos*sizeof(r),ios::beg);
fdirect.read((char *) &r, sizeof r);
fdirect.seekg(-sizeof(r),ios::cur);
strcpy(r.info,"****");
fdirect.write((char *) &r, sizeof r);
// fdirect.close();
}
}