Запишите отдельные элементы в ваш выходной поток, или сделайте так, чтобы структура сделала это, или запишите отдельные элементы в буфер:
struct Part_record
{
char id_no[3];
int qoh;
string desc;
double price:
// Block I/O methods
size_t Size_On_Stream(void) const
{
size_t size = 0;
size = sizeof(id_no) + sizeof(goh) + sizeof(price);
size += descr.length() + 1; // +1 for terminating null character
return size;
}
void Store_To_Buffer(unsigned char *& p_buffer) const
{
std::copy((unsigned char *)&id_no[0], (unsigned char *)&id_no[3], p_buffer);
p_buffer += sizeof(id_no);
std::copy((unsigned char *)&goh, (unsigned char *)(&goh) + sizeof(goh), p_buffer);
p_buffer += sizeof(goh);
std::copy((unsigned char *)&price, (unsigned char *)(&price) + sizeof(price), p_buffer);
p_buffer += sizeof(price);
strcpy(p_buffer, descr.str());
p_buffer += descr.length();
*p_buffer = 0x00;
++p_buffer;
return;
}
void Write_To_Stream(ostream& output) const
{
size_t buffer_size = Size_On_Stream();
unsigned char * buffer = new unsigned char [buffer_size];
unsigned char * p_buffer = buffer;
Store_To_Buffer(p_buffer);
output.write((char *)buffer, buffer_size);
delete [] buffer;
return;
}
};
Поскольку у вас есть значения с плавающей точкой, целочисленные значения и текст, я весьма предлагаю вам использовать ASCII или текстовый формат, такой как CSV или XML. Двоичные версии чисел (целые и с плавающей запятой) могут быть несовместимы на разных платформах, между версиями ОС или даже версиями компилятора. Кроме того, текст переменной длины является трудной задачей в двоичных форматах.