2015-07-17 1 views
-4

Когда я нажимаю «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(); 
    } 
+4

Неверные выражения 'case'. Они должны быть «1» и «2» вместо «1» и «2». Вы также должны начать проверку ошибок, возвращаемых функциями, которые вы вызываете. Также см. [Почему iostream :: eof внутри условия цикла считается неправильным?] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) –

+5

Пожалуйста не случайно добавляйте совершенно разные вопросы к концу вашего предложения ... –

+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. Ваш случай выражения неверны. Вы используете значения 1 и 2, которые отличаются от значений ASCII для и ключей. Вы должны использовать «1» и «2» вместо простых 1 и 2.

  2. Вы также должны начать проверку ошибок, возвращаемых функциями, которые вы вызываете, например open.

  3. Проверка на eof в вашем цикле while определенно не сработает. См. Q & A @Why is iostream::eof inside a loop condition considered wrong?

0

Должно быть:

switch(choice) 
{ 
    case '1': 
     EnterRecord(); 
     break; 
    case '2': 
     ShowRecord(); 
     break; 
} 
+0

Это не единственная проблема. Использование 'eof' в цикле' while' будет работать некорректно и 'myfile.read ((char *) & s2, sizeof (student));' is ** так совершенно абсолютно неверно ** –

+0

Операторы switch работа с проблемой заключается в чтении данных из файла. – jawad

+0

@jawad Нет, это не так. значение literal ''1'' _not_ совпадает с значением' 1' (которое используется в выражении 'case'). Так что либо он не работает, либо вы не опубликовали свой реальный код. –

Смежные вопросы