2010-04-07 161 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。數字的二進制版本(整數和浮點數)可能在跨平臺,操作系統版本或甚至編譯器版本之間不兼容。而且,可變長度文本是一種處理二進制格式的痛苦。