[英]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)
但這並不能解決問題。 但是,當我僅將向量寫入文件而不嘗試讀取它時,代碼將成功運行而沒有任何錯誤。
當我嘗試讀取向量時,有人知道導致代碼錯誤的原因嗎? 以及我遇到的那種錯誤。 我可以從文件中寫入和讀取矢量而沒有任何錯誤的正確方法是什么。
二進制文件,無非就是字節序列。 另一方面,學生向量是內部使用指針的復雜對象:向量具有指向其內部數組開頭的指針,並且由於學生似乎具有字符串屬性,因此每個學生對象都將具有指向內部數組的指針。字符數組。
您不能希望僅編寫向量的頂級部分就足夠了。 您需要的是序列化 ,這意味着在復雜對象和字節序列之間進行轉換(雙向)。
通常通過以下方式對向量進行序列化(二進制形式):
不知道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.