Đọc tệp nhị phân khi chưa biết kích thước của file

em đang cố đọc tệp nhị phân khi chưa biết kích thước của file bằng while(!f.eof()) nhưng mà ko đc
Mọi ng giúp em với

void read_file(Qlhs a[],int &n)
{
	fstream file2;
	
		file2.open("sinhvien02.dat",ios::in|ios::binary);
	if(!file2)                    
	{
		cout<<"\nKhong mo duoc file!!"<<endl;
		exit(1);
	}
	n=0;
while(!file2.eof())
	{
		file2.read((char*)&a[n],sizeof(Qlhs));
		n++;
	}
	
	
		file2.close();
 	output(a,n);	 
}

EDIT (@library): cậu nhớ dùng Markdown để post code ở các post sau nhé! :smile:

Chưa đủ thông tin để giúp bạn.

  1. Cấu trúc Qlns của bạn cụ thể như thế nào?
  2. Phần ghi vào tập tin đâu?

Tốt nhất là toàn bộ mã có liên quan bạn nên đưa lên.

1 Like

Đây là bài tập lớn nên hơi dài nên em ko gửi đầy đủ đc ạ. Đây là struct

struct Qlhs
{	
	
	char ma[15];
	char khu[30];
	float toan;
	float van;
	float diemut;
	float tong;
};

Ghi tệp

void write_file(Qlhs a[],int &n)
{
	fstream file;
	file.open("sinhvien01.dat",ios::out|ios::binary);
	if(!file)
	{
		cout<<"\nKhong mo duoc file!!"<<endl;
		exit(1);
	}
	for(int i=0;i<n;i++)
	{		
		
			file.write((char *)&a[i],sizeof(Qlhs)*n);
			
	}

	file.close();
	
}

Thông thường thì với mấy bài đọc data như vầy, bạn nên lặp dựa vào kết quả trả về của hàm read này thay vì eof

3 Likes

Lặp n lần và trong mỗi lần lặp, ghi n lần cấu trúc Qlns. Tổng cộng là ghi n^{2} lần dữ liệu.
Từ 3 dòng dữ liệu, bạn ghi thành 9 dòng và khi đọc với eof bị “thòi” thêm 1 dòng nữa (dòng này chứa 0 byte dữ liệu), tổng là 10 nghe hợp lý đấy.

Bạn ghi có 3 dòng nó ra 10 dòng sao không nói rõ ra vậy?

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