当我按下" 2"为了读取文件,虽然我的语法是正确的,但是不能读取文件中的数据。为什么我的程序无法读取数据?顺序访问文件和随机访问文件之间有什么区别?为什么首选随机访问文件?
void EnterRecord();
void ShowRecord();
using namespace std;
class student
{
int rollno;
string name;
int marks;
public:
void SetData();
void DisplayData();
void MainMenu();
};
void student:: MainMenu()
{
cout<<" "<<endl;
cout<<"press 1 to enter record"<<endl;
cout<<"press 2 to show record"<<endl;
}
void student::SetData()
{
cout<<"enter roll no of student"<<endl;
cin>>rollno;
cout<<"enter name of student"<<endl;
cin>>name;
cout<<"enter marks of student"<<endl;
cin>>marks;
}
void student::DisplayData()
{
cout<<rollno<<setw(10)<<setw(10)<<marks<<endl;
}
int main()
{
student s1;
int choice;
repeat:
s1.MainMenu();
cout<<"enter ur choice ::"<<endl;
cin>>choice;
switch(choice)
{
case 1:
EnterRecord();
break;
case 2:
ShowRecord();
break;
}
return 0;
}
void EnterRecord()
{
ofstream myfile;
myfile.open("student3.txt",ios::app);
int choice=1;
while(choice==1)
{
student s1;
s1.SetData();
myfile.write((char*)&s1,sizeof(student));
cout<<"press 1 to enter record again"<<endl;
cin>>choice;
if(choice!=1)
{
system("cls");
s1.MainMenu();
}
}
myfile.close();
}
void ShowRecord()
{
student s2;
ifstream myfile;
myfile.open("student3.txt");
myfile.seekg(0);
while(myfile.eof())
{
myfile.read((char*)&s2,sizeof(student));
}
s2.DisplayData();
}
答案 0 :(得分:1)
最大的问题是,您正在处理student
的实例,就好像它是一个普通旧数据块(POD),如果它不是。它包含std::string
的实例,其中包含您不知道的内部数据。第一个也是最明显的是它包含一个指向字符串数据的指针。当你写出来时,你保存指针值而不是实际的字符串。当你重新加载它时,读取旧的指针值,只有你是一个非常幸运的妖精才有效。
您的函数EnterRecord
和ShowRecord
将需要更新,以便它们序列化student
的每个成员,而不是将其作为单个简单旧数据块写出来。像下面这样的东西应该让你开始。
保存数据:
myfile << st.rollno;
myfile << st.name;
myfile << st.marks;
正在加载数据
myfile >> st.rollno;
myfile >> st.name;
myfile >> st.marks;
由于您没有提供有关如何布置文件的任何信息,因此您可以自行决定如何进行操作。传统上你会重载operator>>
和operator<<
但是因为这看起来像家庭工作可能有点多。
您的代码还有其他一些问题......
您的案例表达方式不正确。您正在使用值 1和2,它们与 1 和 2 键的ASCII值不同。你应该使用&#39; 1&#39;和&#39; 2&#39;而不仅仅是1和2.
您还应该开始检查您调用的函数返回的错误,例如open
。
在while循环中检查eof
肯定不会起作用。请参阅Q&amp; A @ Why is iostream::eof inside a loop condition considered wrong?
答案 1 :(得分:0)
应该是:
switch(choice)
{
case '1':
EnterRecord();
break;
case '2':
ShowRecord();
break;
}