所以我遇到了一個無法正確讀取二進制文件到我的結構中的問題。其結構如下:將二進制文件讀入結構(C++)
struct Student
{
char name[25];
int quiz1;
int quiz2;
int quiz3;
};
它是37個字節(來自char數組的25個字節,每個整數4個字節)。我的.dat文件是185字節。這是5名學生的3個整數等級。所以每個學生需要37個字節(37 * 5 = 185)。
它看起來以純文本格式是這樣的:
Bart Simpson 75 65 70
Ralph Wiggum 35 60 44
Lisa Simpson 100 98 91
Martin Prince 99 98 99
Milhouse Van Houten 80 87 79
我能單獨使用此代碼來讀取每個記錄:
Student stud;
fstream file;
file.open("quizzes.dat", ios::in | ios::out | ios::binary);
if (file.fail())
{
cout << "ERROR: Cannot open the file..." << endl;
exit(0);
}
file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));
while(!file.eof())
{
cout << left
<< setw(25) << stud.name
<< setw(5) << stud.quiz1
<< setw(5) << stud.quiz2
<< setw(5) << stud.quiz3
<< endl;
// Reading the next record
file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));
}
我也得到一個好看的輸出,但我希望能夠一次讀入一個整體結構,而不是一次只讀取每個結構的各個成員。這個代碼是我相信完成任務所需要的,但是...它不起作用(我會在後面顯示輸出):
*不包括文件和結構開放的相似部分聲明等。
file.read(reinterpret_cast<char *>(&stud), sizeof(stud));
while(!file.eof())
{
cout << left
<< setw(25) << stud.name
<< setw(5) << stud.quiz1
<< setw(5) << stud.quiz2
<< setw(5) << stud.quiz3
<< endl;
file.read(reinterpret_cast<char *>(&stud), sizeof(stud));
}
OUTPUT:
Bart Simpson 16640179201818317312
ph Wiggum 288358417665884161394631027
impson 129184563217692391371917853806
ince 175193530917020655191851872800
只有一部分它不弄亂是第一個名字,之後,它的下了山。我已經試過一切,我我不知道什麼是錯的。我甚至搜遍了我有的書,但找不到任何東西。那裏的東西看起來像我擁有的和他們的工作,但由於某些奇怪的原因,我的不是。我在第25個字節做了file.get(ch)(ch是一個char),它返回了K,這是75的ASCII碼。這是第一個測試分數,所以,一切都應該在這裏。這只是沒有正確閱讀我的結構。
任何幫助將不勝感激,我只是堅持這一個。
編輯:在收到你們大量意想不到的好消息後,我決定接受你的建議,並堅持一次一個人的閱讀。我通過使用函數使事情變得更清潔和更小。 再次感謝您提供如此快速和啓發性的輸入。非常感謝。
如果你在那不建議大多數解決方法感興趣,滾動向底部,由user1654209第三的答案。該解決方案完美無瑕地工作,但閱讀所有評論,看看爲什麼不受歡迎。
你能說明你是如何寫這個文件的嗎? – 2013-03-21 08:36:19
如果您打印'sizeof(Student)',您將看到它不是37個字節。它可能是40或56. – 2013-03-21 08:36:51
@RetiredNinja我沒有包括所有的代碼,以避免太長時間的帖子,對不起。這裏是我的整個代碼@ codepad:http://codepad.org/331LdCYY – 2013-03-21 08:38:34