30/09/2018, 20:57

Vấn Đề Đọc Ghi File

Cho em hỏi 1 chút về vấn đề đoc ghi file nhị phân.

#include<iostream>
#include<fstream>
using namespace std;
struct hs{
	string name;
	int tuoi;
};
int main(){
	hs a;
	hs b;
	a.name="Nguyen Van A";
	a.tuoi=8;
	fstream f;
	f.open("abc.txt",ios::out|ios::binary);
	f.write((char*)(&a),sizeof(hs));
	f.close();
	fstream f1;
	f1.open("abc.txt",ios::in|ios::binary);
	f1.read((char*)(&b),sizeof(hs));
	f1.close();
	cout<<b.name<<" tuoi: "<<b.tuoi;
	return 0;
}
/*int main(){
	hs b;
	fstream f;
	f.open("abc.txt",ios::in|ios::binary);
	f.read((char*)(&b),sizeof(hs));
	f.close();
	cout<<b.name<<"  "<<b.tuoi;
}*/

Em có chuong trình như vầy. Em cho chạy thì kết quả bình thường, file abc cũng đã lưu hs a vào file
nhưng vấn đề là ở chỗ, nếu em comment lại hàm main đầu tiên và cho chạy hàm main thứ 2 ( tức là em chỉ đọc file ) thì lại có lỗi , em nghĩ là lỗi do hs b chưa có thông tin mà mình lại bắt cout ra nên có lỗi, nhưng vì em đã chạy hàm main đầu tiên trước nên file đã có thông tin, sau đó em đọc file lưu vào hs b vậy tại sao lại không được.

captain america viết 23:10 ngày 30/09/2018

Có ai không giúp em với

Trương Quang Hiếu viết 23:04 ngày 30/09/2018

Không giúp được bạn. Nhưng khả năng cả đoạn code phía trên của bạn cũng có vấn đề Vì mình chạy thử thì đoạn 1 dù ra kết quả nhưng nó vẫn xảy ra lỗi.
Bạn thử dùng cách khác đọc và ghi binary file xem. Vì mình thấy còn nhiều cách khác không dùng fstream mà.

Minh Hoàng viết 22:57 ngày 30/09/2018

f.read((char*)(&b),sizeof(hs));

trong struct học sinh của bạn có thuộc tính name là kiểu string.
Ở đoạn code thứ nhất bạn chỉ ghi xuống địa chỉ của đối tượng string và sau đó đọc lại lập tức đoạn code này. Tức là bạn chỉ đọc và ghi địa chỉ chứ không phải data.
Ở đoạn code thứ hai bạn đọc một địa chỉ lên thì data ở địa chỉ đó đã không còn nữa rồi, vì sau khi tắt chương trình thì OS đã lấy lại vùng nhớ rồi.
Edit: ko hẳn là địa chỉ, chỉ là các dữ liệu rác.
Giải pháp: phải đọc ghi “dữ liệu”.

Bùi Đình Ngọc viết 23:13 ngày 30/09/2018

Bây giờ thế này nhé !
Giả sử cho bạn 1 cái file mà định dạng của nó bạn không hề biết , hỏi bạn làm cách nào đọc được file đó ?
Bạn sẽ đọc bao nhiều bytes ? 10 hay 20 hay 200 bytes cho một bản ghi
Nếu bạn không đọc được thì máy tính cũng sẽ không đọc được .

Maskma viết 22:59 ngày 30/09/2018
void WriteString(ofstream& file, const string& str)
{
	unsigned long len = str.size();
	file.write( reinterpret_cast<const char*>(&len), sizeof(len));
	file.write( str.c_str(), len);
}

string ReadString(ifstream& file)
{
	string str;
	unsigned long len;
	file.read( reinterpret_cast<char*>(&len), sizeof(len));
	if (len > 0)
	{
		char* buf = new char[len];
		file.read(buf, len);
		str.append(buf, len);
		delete[] buf;
	}
	return str;
}

bạn hãy read/write string vào file bằng 2 hàm này. 2 hàm này ms thực sự lưu trữ dữ liệu của string vào file, còn như cách bạn làm là ghi địa chỉ của string lúc đang chạy chương trình (sau khi tắt và bật lại địa chỉ sẽ khác => bạn chả lưu đc gì cả)

captain america viết 23:02 ngày 30/09/2018

à à em cũng phần nào hiểu được vấn đề rồi, cám ơn các bác nhá :)))), thảo nào lúc em dùng char[] thì không sao

Bài liên quan
0