Đọc ghi mảng vào file nhị phân trong C++

mình có chương trình bên trái ảnh là chương trình ghi, bên phải ảnh là chương trình đọc
trục trặc ở chỗ là khi int mang [] = {1,2,3,4,5}; để trong hàm ghi(); thì dữ liệu mới được ghi vào file
còn để ở hàm main thì dữ liệu ghi vào file là giá trị rác

prototype của phương thức write(buff, n)
buff là 1 con trỏ kiểu char hoặc địa chỉ của 1 kí tự, n là số byte ghi vào
trường hợp này mình truyền biến mảng mang vào hàm ghi(); nhưng hình như ghi.write((char *)&mang, sizeof(mang)); có lỗi

lỗi ở đâu nhỉ :stuck_out_tongue:

1 Like

@@ đúng là vậy thật thế mình đổi thành , sizeof(int) * 5 nhưng vẫn bị lỗi

1 Like

ra là lấy sizeof() sau khi ép kiểu nên bị sai :smiley:

// sửa, k phải do casting?

1 Like

nhưng tại sao như ct này để mang ở trong hàm ghi
cũng casting trước rồi mới lấy sizeof mà nó vẫn được 20 nhỉ

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void ghi(string);

int main(){

	ghi("output.dat");
	system("pause");
	return 0;
}

void ghi(string name){
	int mang[] = { 1, 2, 3, 4, 5 };
	ofstream ghi(name, ios::binary);
	cout << sizeof(mang);
	ghi.write((char *)mang, sizeof(mang));
	cout << sizeof(mang);
	//ghi.write((char *)&mang, sizeof(int) * 5);
	//	ghi.write((char *)&mang, sizeof(mang));
	cout << "Write data finished" << endl;
	ghi.close();
}

tại sizeof(x) trả về kích cỡ tính theo byte của x. mang là mảng 5 int thì nó có size của nó là 20 bytes đúng rồi. sizeof() được đánh giá trong khi biên dịch, trường hợp ít khi chạy mới đánh giá. Có thể coi nó là 1 macro chứ ko phải 1 hàm. Khi biên dịch sizeof(mang) thì trình dịch nó biết mang là int[5] nên nó thế sizeof(mang) thành số 20.

còn nếu truyền mảng vào hàm, thực tế là truyền con trỏ chứ ko phải mảng, nên cách tính size của mảng nó khác:

void ghi(string name, int mang[5], int soPhanTu) //mặc dù ghi là int[5] nhưng mang truyền vào vẫn là con trỏ
{
    ...
    //sizeof(mang) //trả về kích cỡ của con trỏ (4 hoặc 8 byte), ko phải size của mảng
    //soPhanTu cho biết số phần tử có trong mang
    //sizeof(*mang) //(hoặc sizeof(int) vì *mang có kiểu là int) cho biết kích cỡ (theo byte) của 1 phần tử mà mang trỏ tới
    sizeof(*mang) * soPhanTu; //kích cỡ của mảng mà mang trỏ tới, tính theo byte.
}
3 Likes

anh ơi cho em hỏi, việc anh ghi (char *)&mang hay reinterpret_cast<char*>(&mang) có khác gì với (char *)mang hay reinterpret_cast<char*>(mang) không ạ

không nếu mang là kiểu mảng, còn kiểu con trỏ thì khác nha :V

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