2010-04-07 163 views
3

下面是数据结构变量:写入二进制文件?

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)); 

三个变量,库存量,id_no上&价格,写出正确的,但“递减” 变量是不正确的。 我是否需要以其他方式初始化Part_record?它应该是20个字符的长度。

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

回答

3

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

0

string数据将不会被写入;您应该使用char[20]来代替,因为string是一个动态类,它没有固定的大小(从技术上讲,它具有固定的大小,但包含指向动态可扩展字符数组的指针)。

我说char[20],因为你提到的字符串应该是20个字符。但是,一定要为终止空字节包含一个额外的字符。另外,你的例子包含一个有25个空格的字符串,所以在这种情况下你需要一个char[26]

如果你有任何大小的字符串,你不知道的最大尺寸,那么你就必须做一些更复杂的不是简单地在结构中所有的数据。

+1

海报应该单独读写每个元素,而不是在整个结构中使用块I/O。块I/O中有很多空洞,并且带有'std :: string'的字段就是其中之一。对于更快的I/O,可以将结构的成员*连续*复制到缓冲区中,然后将缓冲区写成一个块。OP设计中的另一个缺点是编译可以在字段之间插入填充。 – 2010-04-07 22:37:27

0

std::string包含指向真正的字符数据,而你序列化的原始结构,即指针。

分开来写每个变量,与字符串特殊处理(即使用desc.data()desc.size()得到字符串的数据的PTR和长度。)

1

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

如果您需要将std::string数据写入文件,我建议使用iostream库。如果做不到这一点,你可以用part.desc [0]来实现类似的东西直接访问字符数据,你尝试什么:

fwrite(&part.desc[0], part.desc.size()); 
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。数字的二进制版本(整数和浮点数)可能在跨平台,操作系统版本或甚至编译器版本之间不兼容。而且,可变长度文本是一种处理二进制格式的痛苦。