
c++ / Лекция=файлы
.docПотоки в С++. Поточные классы
Поток – абстрактное понятие, определяющее перенос данных (последовательность байтов) от источника к приемнику |
Классификация потоков
-
по направлению обмена
-
по виду устройств
Базовый файловый ввод-вывод
Базовый файловый ввод-вывод осуществляется в Си++ через три класса:
Базовый класс для поточного ввода и вывода в С++
|
Дочерние класс
|
Производные классы |
Обеспечивают |
ios
|
o
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);