gpt4 book ai didi

读取文件期间的 C++ 数据损坏

转载 作者:行者123 更新时间:2023-11-28 03:03:36 25 4
gpt4 key购买 nike

我正在编写一个 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() 中的注释代码是用于将数据写入文件的 block 。这是我得到的输出的示例屏幕截图。 Screenshot of the output.

问候普里亚布拉塔

最佳答案

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

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

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

关于读取文件期间的 C++ 数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20177705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com