Hỏi về reinterpret_cast và cách đọc ghi file trong C++

a/c cho em hỏi về hàm ghitep này, tại sao lại mở file input.dat ở dạng binary ạ, cấu trúc câu lệnh write và câu lệnh reinterpret_cast này dùng để làm gì ạ?

void bangluong::ghitep(){
    ofstream ghi("input.data", ios::binary);
    ghi.write(reinterpret_cast<const char*>(this), sizeof(bangluong));
    ghi.close();
}
void bangluong::doctep()
{
    ifstream doc("input.dat", ios::binary);
    bangluong a;
    doc.read(reinterpret_cast<char*>(&a), sizeof(bangluong));

    cout << "\n ---------Thong tin bang luong doc tu tep--------\n";
    cout << "thang: " << a.thang << endl;
    for (int i = 1; i <= a.tscando; i++)
    {
        cout << "\n Luong cua can bo " << i << " la: " << a.dslcanbo[i].luong;
    }
        cout << "\n Tong luong thang: " << a.tongluong;

    doc.close();
}

Bởi vì ở đây ghi đọc dữ liệu của một đối tượng chứ không phải text đơn thuần. Nên phải lưu và đọc ở chế độ binary mới giữ được cấu trúc dữ liệu không bị thay đổi khi ghi đọc.

reinterpret_cast trong trường hợp này để chuyển một con trỏ kiểu này sang kiểu khác.
Dữ liệu ghi đọc được lưu vào biến dạng bangluong. Vì vậy this hoặc &a là dạng const bangluong* hoặc bangluong*.
Nhưng hàm read write lại nhận con trỏ const char* hoặc char* nên phải dùng reinterpret_cast để chuyển đổi.

5 Likes

a cho e hỏi thêm là ở chỗ lệnh write e bỏ const char* đi và thay bằng char* thì chương trình vẫn chạy như thường, vậy sử dụng const char* có tác dụng gì anh, mình có thể bỏ const đi dc không ạ?

const char* để tránh thay đổi vùng nhớ, dùng để bắt bug.

4 Likes

const là để báo vùng nhớ này không thể thay đổi.

Thực tế vùng nhớ của em có 2 loại là const và không.
Với vùng nhớ bình thường (có thể delete, new…) thì có thể cast sang const char* hoặc char đều được.

Nhưng một số vùng nhớ là const thì em bắt buộc phải dùng const khi chuyển đổi.

Ví dụ:

std::wstring s = L"Hello";
var c = reinterpret_cast<const char*>(s.c_str());

Trường hợp trên thì s.c_str là một const wchar_t* nên khi chuyển sang char* cũng phải dùng const.

4 Likes

em cảm ơn anh nhiều ạ

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