Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

c++ / Лекция=файлы

.doc
Скачиваний:
104
Добавлен:
02.04.2015
Размер:
74.75 Кб
Скачать

Потоки в С++. Поточные классы

Поток – абстрактное понятие, определяющее перенос данных (последовательность байтов) от источника к приемнику

Классификация потоков

  • по направлению обмена

  • по виду устройств

Базовый файловый ввод-вывод

Базовый файловый ввод-вывод осуществляется в Си++ через три класса:

Базовый

класс для поточного ввода и вывода в С++

Дочерние

класс

Производные классы

Обеспечивают

ios 

ostream 

istream 

iostream 

ofstream

вывод в файл

ifstream

ввод из файла

fstream

как ввод, так и вывод

  • Создание потоков:

ifstream in; // поток для чтения данных из файла

oftream out;// поток для вывода данных в файл

fstream both;// поток для ввода и вывода данных

  • Связывание потока с именем файла

Функция open( ) для каждого потокового класса своя

  • Закрытие потоков

in.close( );

out.close( );

both.close( );

Чтение текстового файла

Текст программы

Комментарий

#include <stdlib.h>

#include <iostream.h>

#include <fstream.h>

#include <conio.h>

int main()

{

char buff[81];

ifstream infile;

infile.open("readfile.cpp");

if (!infile) return 0;

while (!infile.eof())

{

infile.getline(buff,sizeof(buff));

cout<<buff<<endl;

}

infile.close();

getch();

return 0;

}

Для ввода-вывода на консоль

Для работы с файлами в стиле C++

резервирование символьного массива

cоздание экземпляра класса ifstream-входной поток

файл этой программы открыт для чтения

проверка, успешно ли открыт файл?

функция eof() принадлежит классу ifstream и возвращает true , если достигнут конец файла

считывание одной строки файла и помещение ее в символьный массив buff

вывод содержимого на экран

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

Замечания

1.Можно использовать конструктор с параметром для указания имени файла

ifstream infile("readfile.cpp");

В этом случае вызов функции open() не требуется.

2.При использовании полного пути доступа в качестве имени файла директории должны разделяться двумя слешами, например,

ifstream infile(“d:\\MyDir\\Primer\\file1.txt”);

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

while (!infile.eof())

{

float x;

infile>>x; // считывание и автоматическое преобразование текста в

// действительное число

cout << x<<endl;

}

Вывод в текстовый файл

Текст программы

Комментарий

#include <stdlib.h>

#include <iostream.h>

#include <fstream.h>

#include <conio.h>

int main()

{

ofstream outfile("re1.txt");

if (!outfile) return 0;

for (int i=0;i<10;i++)

{

outfile<<i<<endl;

}

outfile.close();

getch();

return 0;

}

cоздание экземпляра класса ofstream

Цикл для записи 10 чисел

Для вывода используется оператор вставки <<

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

Режимы открытия файлов

Режим

Описание режима

ios::binary

Открывается в двоичном виде

ios::app

Открывается для добавления новых данных в конец файла

ios::ate

Маркер позиции файла устанавливается на конец файла

ios::in

Файл открывается для чтения. Режим по умолчанию для класса ifstream

ios::out

Файл открывается для записи. Режим по умолчанию для класса ofstream

Чтение и запись бинарных файлов

Функция

Определение

1 способ

get()

Считывает символ из файла

put()

Записывает символ в файл

2 способ

read()

Считывает блок данных

write()

Записывает блок данных

gcount()

Возвращает количество символов, считанных при выполнении последней операции ввода данных

Организация прямого доступа к элементам файла

seekg(число байт, признак начала, конца или текущей позиции)

Перемещает указатель на нужную позицию для ввода данных

seekp(число байт, признак начала, конца или текущей позиции)

Перемещает указатель на нужную позицию для вывода данных

ios::beg

Признак начала файла

ios::cur

Признак текущей позиции

ios::end

Признак конца файла

Пример

Использование функций get() и put()

Функция

Определение

#include <iostream.h>

#include <fstream.h>

#include <conio.h>

int main()

{

char p[5]={'a','v','c','d','t'}; ofstream out("test.dat",ios::binary);

for (int i=0;i<5;i++)

{

out.put(p[i]);

}

out.close();

char ch;

ifstream in("test.dat",ios::binary);

while (in)

{

in.get(ch);

if (in) cout <<ch;

}

in.close();

getch();

return 0;

}

открыть бинарный файл для записи

вывод одиночного символа в файл

закрыть файл

открыть бинарный файл для чтения

чтение одиночного символа из файла

вывод прочитанного символа на экран

Использование функций read( ) и write( )

Текст программы

Комментарий

#include <fstream.h>

#include <iostream.h>

#include <conio.h>

struct three_d

{

int x,y,z;

}buf;

int main()

{

ofstream out("i1.dat",ios::binary);

if (!out)

{

cout<<"ERROR";

getch();

return 1;

}

for (int i=1;i<4;i++)

{

buf.x=i;buf.y=2*i;buf.z=3*i;

out.write((char *) &buf, sizeof (buf));

}

out.close();

puts(" Done");

getch();

ifstream in("ira1.dat",ios::binary);

if (!in)

{

cout<<"ERROR";

getch();

return 1;

}

while (!in.eof())

{

in.read((char *) &buf, sizeof(buf));

cout<<in.gcount()<<endl;

if (!in.eof())

cout<<buf.x<<buf.y<<buf.z<<endl;

}

in.seekg(3*(sizeof(mon)),ios::beg);

in.read((char *) &mon, sizeof(buf));

in.close();

getch();

return 0;

}

описание структуры (точка с координатами)

Открытие бинарного файла для записи

Если ошибка создания файла

Запись блока данных. Поскольку сам буфер BUF имеет тип структуры, то необходимо преобразовать к байтам

Закрытие файла

Открытие бинарного файла для чтения

Проверка на существование

// while (in) –можно так

//чтение блока данных из файла

//количество байт, прочитанных вызовом функции read()

Если буфер определен не в виде символьного массива, то обязательна!!! операция приведения типа

Если не достигнут конец файла

Смещение на 3-ю запись (нумерация начинается с 0)

Ввод-вывод в С++Builder

Функция

Назначение

FileExists(name_file)

Возвращает True, если файл существует.

name_file –полное имя файла

FileOpen(name_file, Mode);

Mode:

fmCreate

fmOpenRead

fmOpenWrite

fmOpenReadWrite

Открыть файл

Если файл существует, то открывает для записи, в противном случае создает новый файл

Открывается только для чтения

Открывается только для записи

Открывается для чтения и записи

FileCreate(name_file)

Создает новый файл. При ошибке возвращает -1

FileWrite(f,Buf ,m);

Записывает в файл, указанный дескриптором, содержимое буфера Buf в количестве m байт

FileRead(f, Buf, m)

Считывает из файла в буфер Buf m байт

FileSeek(f,n,regim);

Regim:

0

1

2

Позиционирует указатель на n-ую запись.

Смещает указатель с начала файла

Смещает указатель с текущей позиции

Смещает указатель с конца файла

FileClose(f);

Закрывает файл

int f; //дескриптор файла

AnsiString st;

….

if ( FileExists("my.txt") ) // if (SaveDialog1->Execute())

// if (FileExists(SaveDialog1->FileName))

f = FileOpen("my.txt",fmOpenWrite);

else

f = FileCreate("my.txt");

if ( f != -1 )

{

// файл открыт для записи

FileSeek(f,0,2); // установить указатель на конец файла

FileWrite(f,st.c_str(),st.Length());

FileClose(f);