Lỗi đọc, ghi file nhị phân trong C++

Chào các bác, trong lúc đọc, ghi struct trong file nhị phân thì em gặp lỗi như sau: khi trong struct có kiểu string thì vẫn đọc, ghi đc nhưng lại xuất hiện lỗi, nếu thay string bằng mảng kí tự thì đọc, ghi bình thường và không xuất hiện lỗi. Sau đây là code của em:

// trường hợp không lỗi
#include<iostream>
#include<string>
#include<string.h>
#include<fstream>
using namespace std;

struct TEST {
    char a[100];
    char b[100];
};

int main()
{    
    TEST p;
    strcpy(p.a, "Khoa");
    strcpy(p.b, "CNTT");
    FILE* fout = fopen("cde.txt", "wb");
    fwrite(&p, sizeof(TEST), 1, fout);
    fclose(fout);

    TEST q;
    FILE* fin = fopen("cde.txt", "rb");
    if (!fin)
    {
        cout << "Error";
        return 0;
    }

    fread(&q, sizeof(TEST), 1, fin);
    cout << q.a << "/" << q.b << endl;
    fclose(fin);

    return 0;
}
// trường hợp bị lỗi
#include<iostream>
#include<string>
#include<string.h>
#include<fstream>
using namespace std;

struct TEST {
    string a;
    string b;
};

int main()
{    
    TEST p;
    p.a = "Khoa";
    p.b = "CNTT";
    FILE* fout = fopen("cde.txt", "wb");
    fwrite(&p, sizeof(TEST), 1, fout);
    fclose(fout);

    TEST q;
    FILE* fin = fopen("cde.txt", "rb");
    if (!fin)
    {
        cout << "Error";
        return 0;
    }

    fread(&q, sizeof(TEST), 1, fin);
    cout << q.a << "/" << q.b << endl;
    fclose(fin);

    return 0;
}

Hiện tại thì e cũng chỉ mới học qua phần file nhị phân nê cũng chưa biết rõ lắm, mong các pro giúp e. Em sử dụng VS 2019
Đây là ảnh của lỗi trong VS:

Đọc ghi file nhị phân yêu cầu biết chính xác lượng bytes cần sử dụng. Nếu sử dụng string thì đâu thể biết được chính xác data đó có dung lượng bao nhiêu do nó luôn thay đổi số lượng phần tử. Vì thế chúng ta phải dùng 1 kiểu nào đó có dung lượng cố định và trong trường hợp này là mảng char.
Không chỉ string mà kể cả dùng vector, stack, queue hay deque đều sẽ không ghi file nhị phân được.

Nếu muốn sử dụng string mà vẫn muốn ghi file nhị phân thì chuyển string sang mảng char là được.
P/s: Đừng triệu hồi string.h trong C++ nhé. :wink:

8 Likes

Cảm ơn chị, chị nói không dùng string.h là sao v
, e chưa hiểu chỗ này cho lắm.

string.h là thư viện của C. Vì lí do lịch sử nên C++ vẫn giữ lại mấy cái của C(em quên mất gọi là gì rồi, anh có thể search thêm trên gg). Tuy dùng được trong C++ nhưng thường bị coi như lai tạp. Nhìn vào code không biết là đang code bằng C hay C++. Giống như dùng printf() bên C++ mà không dùng cout ấy.
Em cũng từng code theo kiểu vừa dùng C vừa dùng C++ nhưng cái này làm cho người khác rất khó chịu khi nhìn vào.

Vậy nên bỏ nó đi. Bên C++ có cstring thay thế cho string.h bên C đó.

5 Likes

Nhưng mà khi mình dùng cstring thì tức là mình phải dùng kiểu string rồi, chứ nếu mà mình dùng char* thì phải dùng string.h , đâu thể dùng cstring đc. Mặc dù lai tạp giữa C/C++ nhưng có 1 số thứ dùng C đôi khi lại tiện hơn C++ thì mình vẫn dùng chứ có sau đâu bạn. Có 1 số hàm trong string.h dùng rất tiện, mình thấy nó còn tiện hơn các hàm có trong cstring, hay như trong C có hàm realloc dùng khá là tiện, còn trong C++ thì lại không có. Mình cảm thấy là như v, bạn thấy thế nào ?

Anh đang hiểu nhầm 1 chút nhé.
cstring hỗ trợ cho anh làm việc với mảng kí tự(mảng char ấy ạ).
string hỗ trợ cho anh làm việc với kiểu string. Kiểu string nó na ná vector chưa không phải char* nhé.

Bên C++ đã có vector để thay thế cho việc phải cấp phát bộ nhớ. Vector có đầy đủ mọi thứ, thậm chí là có vài phương thức khá hay ho. Tuy nhiên cũng có cái nó không được bằng C.

Thậm chí bản thân em rất muốn dùng hàm getch() trong conio.h của C nhưng nghĩ không nên thêm vào. Nếu sử dụng lung tung như vậy thì người ta đâu chia rõ ra C và C++ làm gì.

P/s: Off topic rồi. Dừng ở đây thôi nhé :wink:. Có gì lập topic mới mọi người cùng thảo luận. :wink:

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