在c++中读取文件时,它如何自动将字符放入字符数组,将数字放入整数变量

While reading a file in c++, how does it automatically puts char in character array and numbers in integer variable?

本文关键字:字符 数组 变量 整数 数字 读取 c++ 文件 何自动      更新时间:2023-10-16
#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;
}
  1. 这是怎么发生的?此外,如果我在文本文件中有"myName19",并且开始读取,然后它自动将myName放在char中,将19放在integer变量
  2. 关闭文件后,tellg指针自动移动到文件
  3. 除了((char*(&x、 sizeof(x((
  1. 这是怎么发生的

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

  1. 关闭文件后,tellg指针是否自动移动到文件的开头

不,在调用close()之后,不再维护tellg指针。

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

  1. 除了((char*(&x、 sizeof(x((

对于二进制文件编号。如前所述,您希望写入和读取它们在内存中的确切字节数。

如果希望在文本文件中具有可读字符,请使用格式化文本运算符<<进行输出,>>进行输入。


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

cin.getline(ak.name, 20);

你可以通过用替换上面的行来解决这个问题

cin >> ak.name;

并在输入时在姓名和年龄之间留出一个空格。

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