为什么我的程序不读取文件中的数据

时间:2015-07-17 14:45:56

标签: c++ file-handling

当我按下" 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();
     }

2 个答案:

答案 0 :(得分:1)

最大的问题是,您正在处理student的实例,就好像它是一个普通旧数据块(POD),如果它不是。它包含std::string的实例,其中包含您不知道的内部数据。第一个也是最明显的是它包含一个指向字符串数据的指针。当你写出来时,你保存指针值而不是实际的字符串。当你重新加载它时,读取旧的指针值,只有你是一个非常幸运的妖精才有效。

您的函数EnterRecordShowRecord将需要更新,以便它们序列化student的每个成员,而不是将其作为单个简单旧数据块写出来。像下面这样的东西应该让你开始。

保存数据:

myfile << st.rollno;
myfile << st.name;
myfile << st.marks;

正在加载数据

myfile >> st.rollno;
myfile >> st.name;
myfile >> st.marks;

由于您没有提供有关如何布置文件的任何信息,因此您可以自行决定如何进行操作。传统上你会重载operator>>operator<<但是因为这看起来像家庭工作可能有点多。

您的代码还有其他一些问题......

  1. 您的案例表达方式不正确。您正在使用 1和2,它们与 1 2 键的ASCII值不同。你应该使用&#39; 1&#39;和&#39; 2&#39;而不仅仅是1和2.

  2. 您还应该开始检查您调用的函数返回的错误,例如open

  3. 在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;
}