当我运行此代码,并在记事本/ wordpad中打开.dat文件时,它会显示一些奇怪的字符
#include<iostream>
#include<fstream>
using namespace std;
class Student
{
int rollno;
char name[20];
char div[20];
public:
void accept()
{
cout<<"enter rollno"<<endl;
cin>>rollno;
cout<<"Enter name"<<endl;
cin>>name;
cout<<"Enter div"<<endl;
cin>>div;
}
void write_rec()
{
ofstream f;
f.open("Student.dat",ios::binary|ios::app);
Student s;
s.accept();
f.write((char*)&s,sizeof(s));
f.close();
}
void display()
{
ifstream f;
Student s;
f.open("Student.dat",ios::binary|ios::in);
while(f.read((char*)&s,sizeof(s)))
s.show();
f.close();
}
void show()
{
cout<<rollno<<endl;
cout<<name<<endl;
cout<<div<<endl;
}
};
int main()
{
Student s;
s.write_rec();
s.display();
}
代码正在编译并完美运行但是当我打开&#34; Student.dat&#34;文件显示一些奇怪的字符
答案 0 :(得分:2)
这一行:
f.write((char*)&s,sizeof(s));
将Student对象的原始二进制字节写入文件。如果那不是您想要的行为,那么您需要做一些其他事情,例如:将您的Student对象的成员字段(特别是rollno
变量,即int
)转换为ASCII文本字符串,并将这些字符串写入文件中。
答案 1 :(得分:0)
:
f.open("Student.dat",ios::binary|ios::app);
和
f.open("Student.dat",ios::binary|ios::in);
你打开二进制文件。尝试删除此选项。
编辑:
当然,正如Jeremy所说,你必须在你的文件中写下有意义的文字。在这一行:
f.write((char*)&s,sizeof(s));
您实际上正在编写对象的每个字节(作为(char *))。如果你了解你正在做什么,以及你想要观察什么,那就好了。但也许你应该从这种方法和杰里米的建议中比较两种输出。