簡體   English   中英

在C ++中的二進制文件中發出結構的讀/寫數組

[英]Issue Read/Write array of structure in binary file in c++

我想將我的數組結構寫入二進制文件。

我的結構

typedef struct student{
     char name[15];
     vector<int> grade;
}arr_stu;

如果在同一程序中進行讀寫,則可以讀寫數據。 但是,如果我創建了另一個僅讀取數據的程序並放入了二進制文件,則該程序將不起作用,因為矢量等級為空。

size = 0;
unable to read from memory

將數組結構寫入文件的程序

int main()
{
arr_stu stu[100];

for (size_t i = 0; i < 100; i++)
{
    strcpy(stu[i].name, randomName());
    for (size_t j = 0; j < 10; j++)
    {
        stu[i].grade.push_back(randomGrade());
    }
}   

ofstream outbal("class", ios::out | ios::binary);
if (!outbal) {
    cout << "Cannot open file.\n";
    return 1;
}

outbal.write((char *)&stu, sizeof(stu));
outbal.close();
}

程序將數組結構讀取到文件

int main(){

    feature_struc stu[100];

    ifstream inbal("class", ios::in | ios::binary);
if (!inbal) {
    cout << "Cannot open file.\n";
    return 1;
}

inbal.read((char *)&stu, sizeof(stu));

for (size_t idx = 0; idx < 100; idx++)
{
    cout << "Name :  " << stu[idx].name << endl;   
    for (size_t index = 0; index < 10; index++)
    {
        cout << endl << "test: " << stu[idx].grade[index] << endl;
    }
}
inbal.close();
return 0;
}

對我來說,使用向量似乎構成了問題,如果將兩者結合在一個程序中就可以很好地工作,我想是因為向量保存在內存中,因此仍然可以訪問。

有什么建議么?

您不能像這樣序列化一個向量。 writeread功能直接訪問給定地址的內存。 由於vector是復雜的類類型,因此僅將其數據內容的一部分順序存儲在其基地址中。 其他部分(堆分配的內存等)位於其他位置。 最簡單的解決方案是將向量的長度寫在文件中,然后是每個值。 您必須遍歷矢量元素以完成此操作。

outbal.write((char *)&stu, sizeof(stu));

sizeof是一個編譯時常量。 換句話說,它永遠不會改變。 如果向量包含1、10、1000或1,000,000個項目,則將相同數量的字節寫入文件。 因此,這種寫入文件的方式是完全錯誤的。

那你寫的結構是non-POD由於vector是一個非POD類型。 這意味着您不能僅僅將其視為可以從中復制或復制到的一組字節。 如果需要進一步的證明,請打開在任何編輯器中創建的文件。 您可以從該文件中的向量中看到數據嗎? 您將看到的很有可能是亂碼。

要將數據寫入文件,您必須正確地序列化數據,這意味着您必須將數據寫入文件,而不是struct本身。 您以某種方式寫入數據,以便在回讀數據時可以重新創建該結構。 最終,這意味着您必須

  1. 將名稱寫入文件,以及名稱可能包含的字節數。
  2. 寫出向量中的項目數
  3. 將每個矢量項目寫入文件。

如果不是這樣,則可以通過某種方式從文件中清楚地找出名稱和向量的數據,以便您讀取代碼的代碼可以正確解析文件並重新創建結構。

二進制文件的格式是什么? 基本上,您必須定義格式,然后將每個元素與該格式進行相互轉換。 您永遠不能只將內部表示形式的位轉儲到磁盤上並期望能夠將其讀回。 (事實上​​,您需要一個reinterpret_cast來在對象上調用ostream::write可以告訴您一些信息。)

暫無
暫無

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

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