Đọc file nhị phân vẫn đầy đủ nội dung nhưng cuối cùng vẫn báo lỗi

#include<iostream>
#include<string>
#include<fstream>
#include<iomanip>
using namespace std;
class sinhvien {
private:
	string masv[10];
	string hoten[25];
	float toan;
	float ly;
	float hoa;
	float dtb;
public:
	void settoan(float toan);
	void setly(float ly);
	void sethoa(float hoa);
	void setmasv(string masv);
	void sethoten(string hoten);
	void setdtb();
	void showInfo();
	bool kiemtra();
	sinhvien();
};
bool sinhvien::kiemtra() {
	if (dtb >= 5 && toan != 0 && ly != 0 && hoa != 0) {
		return 1;
	}
	return 0;
}
sinhvien::sinhvien() {
	masv[0] = '\0';
	hoten[0] = '\0';
	toan = -1.0;
	ly = -1.0;
	hoa = -1.0;
}
void sinhvien::settoan(float toan) {
	this->toan = toan;
}
void sinhvien::setly(float ly) {
	this->ly = ly;
}
void sinhvien::sethoa(float hoa) {
	this->hoa = hoa;
}
void sinhvien::setmasv(string masv) {
	for (int i = 0;i < 10;i++) {
		this->masv[i] = masv[i];
	}
	this->masv[masv.length()] = '\0';
}
void sinhvien::sethoten(string hoten) {
	for (int i = 0;i < hoten.length();i++) {
		this->hoten[i] = hoten[i];
	}
	this->hoten[hoten.length()] = '\0';
}
void sinhvien::setdtb() {
	dtb = (toan * 3 + ly * 2 + hoa) / 6;
}
void sinhvien::showInfo() {
	cout << "Ma sinh vien: ";
	for (int i = 0;i < 10;i++) {
		cout << *(masv + i);
	}
	cout << "\nHo ten: ";
	for (int i = 0;i < 25;i++) {
		cout << *(hoten + i);
	}
	cout << "\nDiem toan: " << toan << endl;
	cout << "Diem ly: " << ly << endl;
	cout << "Diem hoa: " << hoa << endl;
	cout << "Diem trung binh: " << setprecision(3) << dtb << endl;
}
void writetofile(sinhvien a, ofstream& b) {
	b.write((char*)& a, sizeof(sinhvien));
}
int main() {
	ifstream ifs("Thisinh.txt");
	sinhvien* a = new sinhvien[9];
	string b;
	float c;
	if (!ifs) {
		cout << "Loi\n";
	}
	else {
		int i = 0;
		while (!ifs.eof()) {
			getline(ifs, b, '\t');
			a[i].setmasv(b);
			getline(ifs, b, '\t');
			a[i].sethoten(b);
			ifs >> c;
			a[i].settoan(c);
			ifs >> c;
			a[i].setly(c);
			ifs >> c;
			a[i].sethoa(c);
			a[i].setdtb();
			getline(ifs, b, '\n');
			i++;
		}
	}
	ifs.close();
	/*for (int i = 0;i < 9;i++) {
		a[i].showInfo();
	}*/
	sinhvien p;
	ofstream ofs("Thisinh.dat",ios::binary);
	if (!ofs) {
		cout << "Loi\n";
	}
	else {
		for (int i = 0;i < 9;i++) {
			if (a[i].kiemtra() == 1) {
				//a[i].showInfo();
				writetofile(a[i], ofs);
			}
		}
	}
	ofs.close();
	ifstream ifs1("Thisinh.dat", ios::binary);
	if (!ifs1) {
		cout << "Loi\n";
	}
	else {
		while (!ifs1.eof() ) {
			ifs1.read((char*)&p, sizeof(sinhvien));
			if (ifs1.good()) {
				p.showInfo();
			}
		}
	}
	ifs1.close();
	delete[] a;
	system("pause");
	return 0;
}

Đây là bài code của em.
Khi em đọc file nhị phân thì nó vẫn hiển thị đầy đủ nội dung những cuối cùng vẫn báo lỗi .
Mọi người có thể giải thích cho em không ạ?
Em cám ơn.

Báo lỗi là lỗi gì vậy bạn

3 Likes

Không biết là lỗi gì luôn bạn.
Nhưng chương trình không return về 0.
Bạn chạy thử giúp mình đi.

Bạn có nhìn warning lúc compile không?
Bạn có hiểu code chỗ string masv[10]; là khai báo gì không?

4 Likes

Em nghĩ là khai báo kiểu string gồm 10 ký tự.

Lạ nhỉ, thường khi code được bài như thế này thì sẽ không nhầm lẫn lỗi như thế chứ. Cho tui hỏi bạn để khai báo một mảng string thì làm như thế nào?

2 Likes

Bạn nên tìm hiểu lại string trong C++ là gì. Đó là gợi để trả lời 2 câu hỏi của @Stanley00@Le_Trong1. Trả lời được 2 câu hỏi này thì bạn sẽ biết dùng string đúng với ý nghĩa thực sự.

3 Likes

Đọc hiểu xong mấy câu hỏi kia, thì quay lại bài này nếu bạn thật sự khai báo masv là kiểu C-string có 10 phần tử (và tương tự cho hoten) thì khả năng là sẽ hết lỗi thôi.

3 Likes

Nếu mà chương trình bạn hiển thị đầy đủ nội dung chứng tỏ nó không báo lỗi chỗ này:

==> Compiler/IDE dỏm.

Nó không return 0 là vì:

Có thể bạn bỏ dòng đó đi sẽ cảm thấy mình đã giải quyết được vấn đề. Nhưng thực ra có rất nhiều vấn đề trong code của bạn.

5 Likes

std::string vẫn cho gán bằng char mà :smiley:

4 Likes

Ý mềnh là masv.length() lỗi nha, phải là masv[i].length() hoặc masv[0].length()

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?