C++ 在c+中读取文件时+;,它如何自动将字符放入字符数组,将数字放入整数变量? #包括 #包括 #包括 #包括 使用名称空间std; akh类{ 公众: 字符名[20]; 智力年龄; }; int main(){ akh ak; 库特 这是怎么发生的

C++ 在c+中读取文件时+;,它如何自动将字符放入字符数组,将数字放入整数变量? #包括 #包括 #包括 #包括 使用名称空间std; akh类{ 公众: 字符名[20]; 智力年龄; }; int main(){ akh ak; 库特 这是怎么发生的,c++,file-handling,C++,File Handling,您正在按原样将类akh的完整内存布局写入二进制文件。 因此,如果您以相同的方式读回它,并且使用相同的字节数,那么ak实例中将具有相同的内存布局 关闭文件后,tellg指针会自动移动到文件的开头 不,在调用close()后,不再维护tellg指针 对于输入,您正在打开一个新的fstream实例fin,它从文件的开头开始读取 除了((char*)&x,sizeof(x)),还有其他方法可以在二进制文件中读写吗 对于前面提到的二进制文件号,您希望写入和读取它们在内存中的确切字节数 如果要在文本文件中包

您正在按原样将类
akh
的完整内存布局写入二进制文件。
因此,如果您以相同的方式读回它,并且使用相同的字节数,那么
ak
实例中将具有相同的内存布局

  • 关闭文件后,tellg指针会自动移动到文件的开头
  • 不,在调用
    close()
    后,不再维护
    tellg
    指针

    对于输入,您正在打开一个新的
    fstream
    实例
    fin
    ,它从文件的开头开始读取

  • 除了((char*)&x,sizeof(x)),还有其他方法可以在二进制文件中读写吗
  • 对于前面提到的二进制文件号,您希望写入和读取它们在内存中的确切字节数

    如果要在文本文件中包含人类可读的字符,请使用格式化文本运算符
    进行输入


    当我运行您的代码时,您遇到的问题就清楚了。您正在使用的
    std::getline()
    变量从输入到
    ak.name
    的代码中正好包含20个字符:

    #include <fstream>
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    using namespace std;
    
    class akh {
    public:
        char name[20];
        int age;
    };
    
    int main() {
        akh ak;
        cout << "Size of ak:" << sizeof(ak) << endl;
        fstream fout("abc.dat", ios::binary | ios::out);
        cout << "\nEnter your name: ";
        cin.getline(ak.name, 20);
        cout << "\nEnter your age: ";
        cin >> ak.age;
    
        fout.write((char*) &ak, sizeof(ak));
        fout.close();
    
        fstream fin("abc.dat", ios::in | ios::binary);
        fin.read((char*)&ak, sizeof(ak)); // automatically puts name in ak.name and age in ak.age ? How is this happening?
        cout << "\nName: " << ak.name;
        cout << "\nAge: " << ak.age;
        fin.close();
    
        return 0;
    }
    
    您可以通过将上面的行替换为

    cin.getline(ak.name, 20);
    
    输入时在姓名和年龄之间留出一个空格

    这是一个解决方案,其中所有内容都按预期工作,并显示二进制文件的内存布局

    cin >> ak.name;