簡體   English   中英

嘗試從文件讀取矢量時出錯

[英]error when trying to Read vector from file

我是c ++的初學者,我寫了這段代碼來測試是否可以將矢量寫入二進制文件,然后再從文件中讀取矢量。 這是代碼:

vector <student> stud;
vector <student> temp;

void makeObj (string name, int age)
{
student newstudent (nam, ag);
stud.push_back(newstudent);
}

int main ()
{
makeObj("kwame", 14);
stud[0].print();

makeObj("kojo", 12);
stud[1].print();

makeObj("kwabena", 7);
stud[2].print();

fstream gameSave ("gameSaveFile.txt", ios::binary | ios::out | ios::in);
gameSave.write(  (char *) &stud, sizeof(stud));
gameSave.seekg(0);

gameSave.read( (char *) &temp, sizeof(stud));

temp[0].print();

gameSave.close();
return 0;
}

當我運行代碼時,程序正在運行時發生未知錯誤,我無法確定是什么錯誤。 起初我以為這可能是鑄造錯誤。 因此,我決定像這樣使用reinterpret_cast來轉換向量: reinterpret_cast< char *>(&stud)但這並不能解決問題。 但是,當我僅將向量寫入文件而不嘗試讀取它時,代碼將成功運行而沒有任何錯誤。

當我嘗試讀取向量時,有人知道導致代碼錯誤的原因嗎? 以及我遇到的那種錯誤。 我可以從文件中寫入和讀取矢量而沒有任何錯誤的正確方法是什么。

二進制文件,無非就是字節序列。 另一方面,學生向量是內部使用指針的復雜對象:向量具有指向其內部數組開頭的指針,並且由於學生似乎具有字符串屬性,因此每個學生對象都將具有指向內部數組的指針。字符數組。

您不能希望僅編寫向量的頂級部分就足夠了。 您需要的是序列化 ,這意味着在復雜對象和字節序列之間進行轉換(雙向)。

通常通過以下方式對向量進行序列化(二進制形式):

  • 長度的整數(*)
  • 向量每個元素的序列化形式(n個項目)

不知道student班級的確切定義,我無法說出其序列化形式是什么。

(*)在這個簡單的示例中,我假設您將以與編寫文件時相同的體系結構讀取文件。 如果您希望序列化的形式可跨不同體系結構移植,則需要注意整數大小(4字節或...)和字節序。 但是恕我直言,這將是另一個問題。

sizeof(stud)僅顯示向量在堆棧中占據的大小,僅此而已。 另外,向量的指針與其內部數據的指針不同。 您必須使用諸如stud.data()這樣的代碼來緩存內部數據的指針。 而且我認為沒有一種方法可以將向量的內部指針設置為另一個向量,因此您當然無法獲得一個向量的數據指針並將其分配給另一個向量。 我認為您可以使用以下代碼在向量中寫入數據(如果您的student班級中沒有任何指針:

gameSave.write((char*)stud.data(), stud.size() * sizeof(student)); // It just write your data not member variables of vecto

通常,您需要序列化才能完成此工作。 如果您詳細給班級提供更多幫助,則可能會有所幫助。 但是我建議首先針對int這樣的簡單類型執行此工作,然后針對您的情況進行擴展。

暫無
暫無

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

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