#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;
}
答案 0 :(得分:0)
- 这是怎么回事?
您正在按原样将类akh
的完整内存布局写入二进制文件。
因此,如果以相同的方式并以相同的字节数读回它,则ak
实例中的存储器布局将相同。
- 关闭文件后,tellg指针会自动移动到文件的开头吗?
否,调用tellg
之后不再维护close()
指针。
对于输入,您要打开一个新的fstream
实例fin
,该实例将从文件的开头开始读取。
- 除了((char *)&x,sizeof(x))以外,还有什么其他方法可以读写二进制文件?
对于二进制文件如前所述,您要写入和读取字节在内存中的确切排列方式。
如果要在文本文件中使用人类可读的字符,请使用格式化的文本运算符<<
进行输出,并使用>>
进行输入。
当我运行您的代码时,您遇到的问题就很清楚了。您正在使用的std::getline()
变体从输入到ak.name
的20个字符中完全正确:
cin.getline(ak.name, 20);
您可以通过将上面的行替换为
来解决此问题cin >> ak.name;
在输入时在姓名和年龄之间留一个空格。
Here是一种解决方案,其中的所有操作均按预期进行,并显示二进制文件的内存布局。