读取文件时的C ++数据损坏

时间:2013-11-24 17:43:15

标签: c++ file-io

我正在编写一个c ++程序,以二进制模式将数据写入文件并从文件中读取。 我正在写一个对象并读取一个对象。 我面临的问题是,当我写入文件并在该实例中读取它而不关闭程序时,它会工作文件。但是在程序终止执行并注释掉写代码块并尝试读取已经写入的文件之后,我得到了糟糕的输出。

我无法理解出了什么问题。

以下是代码:

#include <fstream.h>
#include <string.h>

class Student{
    protected:
        char *Name, *Sub_code;
        int Roll;
    public:
        Student(){}
};

class Details:private Student{
    private:
        char *Sub_Name;
        int internal_marks, external_marks;
        /*Methods*/
        void setName();
        void setRoll();
        void setSubCode();
        void setSubName();
        void setInternalMarks();
        void setExternalMarks();
    public:
        Details(){
         Name = new char[1];
            Sub_code = new char[1];
            Sub_Name = new char[1];
            Name[0] = '\0';
            Sub_code[0] = '\0';
            Sub_Name[0] = '\0';
            internal_marks = 0;
            external_marks = 0;
            Roll = 0;
        }
        void setDetails();
        void getDetails();
        static void writeDetails(Details detail);
        static void readDetails();
};

void Details::setName(){
    cout<<"Enter Student Name : ";
    char tmp[100];
    tmp[0] = '\0';
    cin>>tmp;
    int len = strlen(tmp);
    Name = new char[len];
    strcpy(Name,tmp);
}

void Details::setRoll(){
    cout<<"Enter Roll Number : ";
    cin>>Roll;
}

void Details::setSubCode(){
    cout<<"Enter Subject Code : ";
    char tmp[100];
    tmp[0] = '\0';
    cin>>tmp;
    int len = strlen(tmp);
    Sub_code = new char[len];
   strcpy(Sub_code,tmp);
}

void Details::setSubName(){
    cout<<"Enter Subject Name : ";
    char tmp[100];
    tmp[0] = '\0';
    cin>>tmp;
    int len = strlen(tmp);
    Sub_Name = new char[len];
   strcpy(Sub_Name,tmp);
}

void Details::setInternalMarks(){
    cout<<"Enter internal marks : ";
    cin>>internal_marks;
}

void Details::setExternalMarks(){
    cout<<"Enter external marks : ";
    cin>>external_marks;
}

void Details::setDetails(){
     setName();
     setRoll();
     setSubCode();
     setSubName();
     setInternalMarks();
     setExternalMarks();
}

void Details::getDetails(){
    cout<<Name<<"\t\t";
    cout<<Roll<<"\t\t";
    cout<<Sub_code<<"\t\t";
    cout<<Sub_Name<<"\t";
    cout<<internal_marks<<"\t";
    cout<<external_marks<<"\t\n";
}

void Details::writeDetails(Details detail){
    ofstream os("StudentsRecord.dat", ios::binary|ios::ate);
    os.write(reinterpret_cast <char *>(&detail),sizeof(detail));
    os.close();
}

void Details::readDetails(){
    Details detail;
    ifstream is("StudentsRecord.dat", ios::binary|ios::in|ios::beg);
    cout<<"Name\tRoll\tSubject Code\tSubject Name\tInternal marks\tExternal Marks\n";
    while (is.read(reinterpret_cast<char *>(&detail), sizeof(detail))){
        detail.getDetails();
    }
    is.close();
}

int main(){
    Details y,x;
    /*for(int i = 0; i < 2; i++){
        x.setDetails();
        Details::writeDetails(x);
    }*/
    Details::readDetails();
    return 0;
}

main()中的注释代码是用于在文件中写入数据的块。 这是我得到的输出的示例屏幕截图。 Screenshot of the output.

关心Priyabrata

1 个答案:

答案 0 :(得分:2)

Detail班里面有char*。当您将其写入文件时,您将写入字符串的实际指针地址,而不是实际的字符串。当你在同一个程序中读回它时它会起作用,因为数据仍在那里。

当你重新运行你的程序时,你会得到垃圾,因为那个指针不在某个随机内存中。

您应该使用为您进行序列化的库。要做到这一点有点困难。 看看https://code.google.com/p/protobuf/,但我确定还有其他的。