Читайте также:
|
|
Сохранение в двоичных файлах данных стандартных типов.
Для того, чтобы открыть двоичный файл, необходимо задать режим доступа ios::binary (в некоторых компиляторах С++ - ios::bin).
Двоичные файлы более компактны и в некоторых случаях более удобны для обработки.
Для создания выходного файла создают объект
ofstream out_fil(“Outfil.dat”,ios::out | ios::binary);
if (! out_fil) { cerr<<”Error: Outfil.dat”<<endl;
exit(1);
}
Для того, чтобы открыть существующий двоичный файл для чтения, нужно создать объект
ifstream in_fil(“Infil.dat”,ois::in | ios::binary);
if (! in_fil) { cerr<<”Error: Infil.dat”<<endl;
exit(2);
}
К сожалению, созданные объекты in_fil и out_fil не слишком приспособлены для работы с двоичными файлами и требуют некоторых дополнительных действий, необходимых для корректной работы.
Пример 14.1. Запись значения типа double в двоичный файл.
# include <fstream>
# include <iostream>
using namespace std;
# include <stdlib.h>
class bin_outstream:public ofstream
{ public:
bin_outstream(const char *fn): ofstream(fn, ios::out | ios::binary){}
void writeOurDate(const void*, int);
ofstream &operator<<(double d) { writeOurDate(&d, sizeof(d));
return *this;
}
};
int main()
{ bin_outstream bin_out(“B_out.dat”);
if (! bin_out) { cerr<<”Unable to write to B_out.dat”<<endl;
exit(1);
}
double d = 5.252;
bin_out<<d;
bin_out<<d*d;
d = 5×2×E-5;
bin_out<<d;
return 0;
}
void bin_outstream:: writeOurDate(const void *Ptr, int len)
{ if (! Ptr) return;
if (len<=0) return;
write((char*)Ptr, len);
Пример 14.2. Чтение значений типа double из двоичного файла.
# include <fstream>
# include <iostream>
using namespace std;
# include <stdlib.h>
class bin_instream: public ifstream
{ public:
bin_instream(const char *fn): ifstream(fn, ios::in | ios::binary){}
void readOurDate(void*, int);
bin_instream &operator>>(double &d) { readOurDate(&d, sizeof(d));
return *this;
}
};
int main()
{ bin_instream bin_in(“B_in.dat”);
if (! bin_in)
{ cerr<<”Unable to open B_in.dat”<<endl;
exit(1);
}
double d;
long count = 0;
bin_in>>d;
while (! bin_in eof())
{ cout << ++count << “:’ << d << endl;
bin_in>>d;
}
return 0;
}
void bin_instream:: readOurDate(void *p, int len)
{ if (! p) return;
if (len <= 0) return;
read((char*)p, len);
}
Для работы с файловыми потоками любого из стандартных типов, нужно перегрузить операторы ввода и вывода под требуемый тип данных или воспользоваться шаблоном класса, задаваемым с помощью ключевого слова template.
Сохранение в двоичных файлах данных, имеющих тип, создаваемый пользователем.
Иногда возникает необходимость сохранить в файле данные, структура которых задается программистом. В этих случаях задают класс, содержащий данные и функции, перегруженные операторы ввода и вывода под эти данные.
Дата добавления: 2014-12-18; просмотров: 241 | Поможем написать вашу работу | Нарушение авторских прав |