簡體   English   中英

寫入二進制文件?

[英]Write to a binary file?

這是帶變量的數據結構:

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和price寫得正確,但“desc”變量不正確。 我是否需要以其他方式初始化Part_record? 它的長度應為20個字符。

如果您有足夠的信息,請分享您的建議。

std::string將其數據保存在動態分配的內存中,而不是結構Part_record

您不能以這種方式將std::string對象(或任何STL容器)寫入文件。 它們包含動態分配的數據的內部指針; 你最終會將指針地址寫入你的文件,而不是字符串的內容。

如果你需要將std::string數據寫入文件,我建議使用iostream庫。 如果做不到這一點,您可以直接使用part.desc [0]訪問字符數據,以實現與您嘗試的類似的操作:

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

string數據不會被寫入; 你應該使用char[20] ,因為string是一個沒有固定大小的動態類(技術上它有一個固定的大小,但包含一個指向動態,可增長的字符數組的指針)。

我說char[20]因為你提到字符串應該是20個字符。 但是,請確保為終止空字節包含一個額外的字符。 此外,您的示例包含一個包含25個空格的字符串,因此在這種情況下您需要一個char[26]

如果您將擁有任何大小的字符串並且您不知道最大大小,那么您將不得不做一些比簡單地將所有數據都放在結構中更復雜的事情。

std::string包含指向真實字符數據的指針,並且您正在序列化原始結構,即指針。

分別編寫每個變量,對字符串進行特殊處理(即使用desc.data()desc.size()來獲取字符串數據的ptr和長度。)

將單個成員寫入輸出流,或使結構執行此操作,或將單個成員寫入緩沖區:

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版本甚至編譯器版本。 此外,可變長度文本是以二進制格式處理的痛苦。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM