为什么我在读取二进制文件时得到垃圾值?

Why am i Getting garbage value when reading a binary file?

为了简单起见,我写了一个简单的代码来重现我的问题。正如您在代码中看到的那样,我创建了一个包含两个成员的结构,然后创建了结构类型的数组,然后对其进行了初始化 student newStudent[3] ={{"joseph",20}, {"yonas",30},{"miryam",40}};。我将结构中的所有信息存储到一个二进制文件 newFile.write(reinterpret_cast<char*>(newStudent), 3 * sizeof(student));(直到这里一切都很好)然后我创建了另一个数组 student loadedStudent[3]; 来加载二进制文件中的所有数据并输出加载的数据使用 for 循环 cout<<"Name: "<<loadedStudent[i].name<<"Age: "<<loadedStudent[i].age<<endl;。问题是我存储的数据是 joseph",20, "yonas",30,"miryam",40 但程序正在输出垃圾值 Name: 8H???Age: 1 Name: J???Age: 1 Name: ?I???Age: 32766。 这是为什么?

#include <iostream>
#include <fstream>

using namespace std;

struct student{
    char name[10];
    int age;
};

int main()
{
    student newStudent[3] ={{"joseph",20}, {"yonas",30},{"miryam",40}};

    fstream newFile;
    newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);

//for(int i = 0; i<3; i++){
        //cout<<"Name: "<<newStudent[i].name<<" Age: "<<newStudent[i].age<<endl;
    //}

    if(newFile.is_open()){

       newFile.write(reinterpret_cast<char*>(newStudent), 3 * sizeof(student));

    }else cout<<"faild to open file";
   
    student loadedStudent[3];
    newFile.seekg(0, ios::beg);

    if(newFile.is_open()){

       newFile.read(reinterpret_cast<char*>(loadedStudent), 3 * sizeof(student));
       newFile.close();

    }else cout<<"faild to open file";

    for(int i = 0; i<3; i++){

        cout<<"Name: "<<loadedStudent[i].name<<"Age: "<<loadedStudent[i].age<<endl;
    }
newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);

打开文件仅供输出。您需要 ios::in | ios::out 才能读写。

当您打开文件时,您只是将其作为输出打开 ios::out 您还应该包括 ios::in 以便您可以访问该文件。现在您正在打印未初始化数组的不确定值。

改变这个

newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::binary);

进入

newFile.open("/Users/josephfeleke/Desktop/abeltest/file.bin", ios::out | ios::in | ios::binary);