Enum open_mode(app, binary, in, out, trunc, ate)

которая определена в базовом классе 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();

}

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: