我无法使用 C-STYLE 读取二进制文件。字符串c++的问题

I cant read a binary file with C-STYLE. Problem with strings c++

出于某种原因,我无法读取包含 C 风格的“字符串”的文件。如果我使用字符数组,那么我可以做到。但我想做弦乐,我想知道怎么做。当我打印 b."x attribute" 时,它显示随机字符。 是的,我知道我应该使用 C++ 文件。但这纯粹是出于教育目的。

代码:

struct Boleta
{
    string name;
    string surename;
    string legajo //156.455-6;
    int cod_materia;
    string date // 2022/10/26;
};
int main()
{
    Boleta boleta;
    FILE * f = fopen("DIAFINALES.DAT", "wb");
    if(!f)
    {
        cout<<"Error al abrir el archivo 'DIAFINALES.DAT'"<<endl;
        return 1;
    }
    while(true)
    {
        cout<<"Name: ", cin>>boleta.name;
        cout<<"Surname: ", cin>>boleta.surename;
        if(boleta.name == "NULO" && boleta.surename == "NULO")
            break;
        cout<<"Legajo: ", cin>>boleta.legajo;
        cout<<"Exam date: ",cin>>boleta.date;
        fwrite(&boleta, sizeof(boleta), 1, f);
    }
    fclose(f);

    FILE * f1 = fopen("DIAFINALES.DAT", "rb");
    if(!f1)
    {
        cout<<"Error al abrir el archivo 'DIAFINALES.DAT'"<<endl;
        return 1;
    }
    Boleta b;
    while(fread(&b, sizeof(b),1,f1))
    {
        cout<<"************************"<<b.legajo<<"******************************"<<endl;
        cout<<"EXAM DATE: "<<b.date<<endl;
        cout<<"Name and surname: "<<b.name<<" "<<b.surename<<endl;
        cout<<"Code of subject: "<<b.cod_materia<<endl;
    }
    fclose(f1);
    return 0;
} 

你试试写'boleta'

struct Boleta
{
    string name;
    string surename;
    string legajo //156.455-6;
    int cod_materia;
    string date // 2022/10/26;
};

像这样的文件

 fwrite(&boleta, sizeof(boleta), 1, f);

这行不通。 std::string 是指向实际字符串数据的指针,实际的字符串不存储在结构中。

所以首先你需要决定你的二进制文件的格式。其中的每条记录是什么样的。我建议你有固定大小的字符串和最后的 cod_materia as 4 byte int

 name........surname........legajo......dat.......cod-
 20          20             10(?)       10        4

写这个有几种方法

我愿意

struct Bol_iobuf{
    char name[20];
    char surname[20];
    char legato[10];
    char date[10];
    int cod_materia;
}

现在您需要将 belato 结构编组到此结构中

 Bolato b; // loaded with data
 Bol_iobuff buff;
 strcpy(buff.name,b.name.c_str());
 strcpy(buff.surname,b.surname.c_str());
 strcpy(buff.legato,b.lagato.c_str());
 strcpy(buff.date,b.date.c_str());
 buff.cod_materia= b.cod_materia;

现在 buff 有一行的所有字节,你可以写了

  fwrite(&buff, sizeof(Bol_iobuff), 1, f);

读取是相同的,但相反,读入 Bol_iobuff 然后将这些字段逐字段编组到 Boleta 实例中

请注意,我没有在 marshal 中检查写入代码,以确保字符串不会太大而无法放入其目标 char 数组(20 和 10 字节)。您可以使用 strncpy 来截断它们,或者您可以在输入函数中使用保护代码以确保您的名称永远不会太长