写入二进制文件?

时间:2010-04-07 20:53:49

标签: c++ file binary

这是带变量的数据结构:

struct Part_record
{
    char id_no[3];
    int qoh;
    string desc;
    double price:
};
---
(Using "cin" to input data)
---
Part_record null_part = {"  ", 0,"                         ",0.0};
---
---
file.seekg( -(long)sizeof(Part_record), ios::cur);
file.write( ( char *)&part, sizeof(Part_record) );

三个变量qoh,Id_no&价格,写出正确,但“desc” 变量不对。 我是否需要以其他方式初始化Part_record?它的长度应为20个字符。

如果您有足够的信息,请分享您的建议。

5 个答案:

答案 0 :(得分:3)

std::string将其数据保存在动态分配的内存中,而不是结构Part_record

答案 1 :(得分:1)

您不能以这种方式将std::string个对象(或任何STL容器)写入文件。它们包含动态分配的数据的内部指针;你最终会将指针地址写入你的文件,而不是字符串的内容。

如果您需要将iostream数据写入文件,我建议您使用std::string库。如果不这样做,您可以直接使用part.desc [0]访问角色数据,以实现类似于您尝试的内容:

fwrite(&part.desc[0], part.desc.size());

答案 2 :(得分:0)

string数据不会被写入;你应该使用char[20],因为string是一个没有固定大小的动态类(技术上它有一个固定的大小,但包含一个指向动态,可增长的字符数组的指针)。

我说char[20]因为你提到字符串应该是20个字符。但是,请确保为终止空字节包含一个额外的字符。此外,您的示例包含一个包含25个空格的字符串,因此在这种情况下您需要char[26]

如果您将拥有任何大小的字符串并且您不知道最大大小,那么您将不得不做一些比简单地将所有数据都放在结构中更复杂的事情。

答案 3 :(得分:0)

std::string包含指向真实字符数据的指针,并且您正在序列化原始结构,即指针。

分别编写每个变量,对字符串进行特殊处理(即使用desc.data()desc.size()来获取字符串数据的ptr和长度。)

答案 4 :(得分:0)

将单个成员写入输出流,或让结构执行此操作,或将各个成员写入缓冲区:

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。二进制版本的数字(整数和浮点)可能不兼容平台,OS版本甚至编译器版本。此外,可变长度文本是以二进制格式处理的痛苦。