30/09/2018, 23:16

Đọ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ỉ

abcxyz viết 01:23 ngày 01/10/2018

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

abcxyz viết 01:29 ngày 01/10/2018

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

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

abcxyz viết 01:17 ngày 01/10/2018

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();
}
viết 01:22 ngày 01/10/2018

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.
}
Bài liên quan
0