Vì vậy, tôi đang gặp một chút vấn đề không thể đọc đúng một tệp nhị phân trong cấu trúc của tôi. Cấu trúc là:Đọc tập tin nhị phân thành một cấu trúc (C++)
struct Student
{
char name[25];
int quiz1;
int quiz2;
int quiz3;
};
Đó là 37 byte (25 byte từ mảng char và 4 byte cho mỗi số nguyên). Tệp .dat của tôi là 185 byte. Đó là 5 học sinh với 3 lớp số nguyên. Vì vậy, mỗi học sinh chiếm 37 byte (37 * 5 = 185).
Nó trông giống như thế này ở định dạng văn bản đơn giản:
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
Tôi có thể đọc từng hồ sơ cá nhân bằng cách sử dụng mã này:
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));
}
Và tôi nhận được một cái nhìn tốt đẹp đầu ra, nhưng tôi muốn có thể đọc trong một cấu trúc toàn bộ tại một thời điểm, không chỉ riêng từng thành viên của mỗi cấu trúc tại một thời điểm. Mã này là những gì tôi tin cần thiết để hoàn thành nhiệm vụ, nhưng ... nó không hoạt động (tôi sẽ hiển thị kết quả sau đó):
* không bao gồm các phần tương tự như mở tệp và cấu trúc khai vv
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
phần duy nhất nó không lộn xộn lên là tên đầu tiên, sau đó nó xuống đồi .. tôi đã thử tất cả mọi thứ và tôi không có ý tưởng gì là sai. Tôi thậm chí đã tìm kiếm qua những cuốn sách tôi có và tôi không thể tìm thấy bất cứ điều gì. Những thứ trong đó trông giống như những gì tôi có và chúng hoạt động, nhưng vì một số lý do kỳ quặc của tôi thì không. Tôi đã làm file.get (ch) (ch là char) ở byte 25 và nó trả về K, là ASCII cho 75 .. đó là điểm kiểm tra đầu tiên, vì vậy, mọi thứ đều ở đâu. Nó chỉ là không đọc trong cấu trúc của tôi đúng.
Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều, tôi chỉ bị mắc kẹt với vấn đề này.
CHỈNH SỬA: Sau khi nhận được một lượng lớn dữ liệu đầu vào bất ngờ và tuyệt vời từ các bạn, tôi đã quyết định thực hiện lời khuyên của bạn và gắn bó với việc đọc từng thành viên một lúc. Tôi làm mọi việc sạch hơn và nhỏ hơn bằng cách sử dụng các chức năng. Cảm ơn bạn một lần nữa vì đã cung cấp đầu vào nhanh chóng và sáng suốt. Nó được nhiều đánh giá cao.
NẾU bạn quan tâm trong cách giải quyết không được đề xuất nhiều nhất, hãy cuộn xuống phía dưới, tới câu trả lời thứ 3 của user1654209. Cách giải quyết đó hoạt động hoàn hảo, nhưng đọc tất cả các nhận xét để xem tại sao nó không được ưa chuộng.
Bạn có thể cho biết cách bạn đã viết tệp không? –
Nếu bạn in 'sizeof (Student)' bạn sẽ thấy rằng nó là _not_ 37 byte. Nó có thể có thể là 40 hoặc 56. –
@RetiredNinja Tôi không bao gồm tất cả các mã để tránh quá dài của một bài đăng, xin lỗi. Đây là toàn bộ mã của tôi @ codepad: http://codepad.org/331LdCYY –