写入文件时出现c ++奇怪的字符

时间:2018-04-01 19:23:31

标签: c++

当我运行此代码,并在记事本/ 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;文件显示一些奇怪的字符

2 个答案:

答案 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);

你打开二进制文件。尝试删除此选项。

您可以看到herehere,这些是特定于平台的行为。

看看this example

编辑:

当然,正如Jeremy所说,你必须在你的文件中写下有意义的文字。在这一行:

    f.write((char*)&s,sizeof(s));

您实际上正在编写对象的每个字节(作为(char *))。如果你了解你正在做什么,以及你想要观察什么,那就好了。但也许你应该从这种方法和杰里米的建议中比较两种输出。