Search code examples
c++subclassfile-handling

I am not able to get input after a certain point ( from the user) even though no error pops wile compiling


This program is a small hospital management program. It works with C++ and uses binary files and classes. it is a simple prog that taken the input of patients details and saves in a binary file, and displays the patients details by searching regno.

The code does not run beyond : cin>>A1.PI.age; and starts printing endless loop of something.

PLEASE REPLY ME ON WHERE HAVE I GONE WRONG

here is the code:

#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>
#include<stdlib.h>

class all
{ private:
struct address
{ int house;
  char street[30];
  char city[30];};
  struct patient_info
{ char name[40];
  address AD1;
  int age;
  int maritalstatus;
  int regno;
  char bldgrp[3];
  char sex;
}PI;
int task;
protected:
 void firstpinfo();
 void showpinfo();
 void enterpinfo();
public:
 void tasks();
 char ch;
 int serial;
}A1;

class date :public all
 { private :
   int day;
   int month;
   int year;
   public:
   void enterdate()
    {cout<<"enter day of date";
     cin>>day;
     cout<<"enter month";
     cin>>month;
     cout<<"enter year";
     cin>>year;
    }
   void showdate()
     { cout<<day<<"/"<<month<<"/"<<year;}
  }D1;



 //global variables
  int count,attempt;

void main()
{ count=0;
  cout<<"                                       HOSPITAL MANAGEMENT SOFTWARE                                      
  ";
  D1.enterdate();
  A1.tasks();
  getch();
  while(count==0)
   { A1.tasks();
     cout<<"press 0 to continue and 1 to exit";
     cin>> count;
   }
  getch();
 }


  void all::tasks()

 { attempt=0;
  D1.showdate();
  cout<<"select task"<<endl
  <<"1.show patient details"<<endl
  <<"2.enter details of a patient"<<endl
  <<"3.exit prog"<<endl;
  cin>>task;
  switch(task)
 {
    case 1: {cout<<"enter regno to display"<<endl;
    int search;
    cin>>search;
    fstream fon;
    fon.open("hospital.dat",ios::in|ios::binary);
    if(!fon)
     {cout<<"error in opening"<<endl;
      getch();
      exit(0);
      }
    else
     {fon.read((char*)&A1,sizeof(A1));
      if(A1.PI.regno==search)
       {cout<<"showing details";
       A1.showpinfo();}
      else
       {cout<<"regno not found";}
        fon.close();
        }
  break;}
case 2: {cout<<"adding a new patient";
  A1.enterpinfo();
  fstream fan;
  fan.open("hospital.dat",ios::in|ios::binary);
  if(fan)
  {fan.write((char*)&A1,sizeof(A1));}
  fan.close();
  break;}
 case 3: { cout<<"exiting...press any key";
   getch();
   exit(0);
   break;
   }
 default: {cout<<"error... press anykey to try again";
  getch();
  A1.tasks();
  };
 }}//END OF TASKS


 void all::showpinfo()
 {cout<<"patient regno\n"<<A1.PI.regno<<endl;
 cout<<"patient name\n"<<A1.PI.name<<endl;
 cout<<"address of patient\n"<<A1.PI.AD1.house<<" "<< PI.AD1.street<<" "<<PI.AD1.city<<endl;
 cout<<"blood group"<<A1.PI.bldgrp<<endl;
 cout<<"sex"<<A1.PI.sex<<endl;
 cout<<"data extracted";
 }

 void all:: enterpinfo()
 {

  cout<<"enter unique registration number";
  cin>>PI.regno;
  cout<<"enter patient name"<<endl;
  cin.getline(A1.PI.name,50);
  cout<<"enter address( house, street, city)"<<endl;
  cin>>A1.PI.AD1.house;
  cin.getline(A1.PI.AD1.street,30);
  cin.getline(A1.PI.AD1.city,30);
  cout<<"enter age in years"<<endl;
  cin>>A1.PI.age;
  cout<<"enter 1 for married and 0 for otherwise"<<endl;
  cin>>A1.PI.maritalstatus;
  cout<<"enter blood group"<<endl;
  cin>>A1.PI.bldgrp;
  cout<<"enter M for male and F for female";
  cin>>A1.PI.sex;

  }

Solution

  • why this happens : This happens because you have mixed cin and cin.getline. when you enter a value using cin, cin not only captures the value, it also captures the newline. So when we enter 2, cin actually gets the string “2\n”. It then extracts the 2 to variable, leaving the newline stuck in the input stream. Then, when getline() goes to read the input, it sees “\n” is already in the stream, and figures we must have entered an empty string! Definitely not what was intended.

    old solution : A good rule of thumb is that after reading a value with cin, remove the newline from the stream. This can be done using the following :

    std::cin.ignore(32767, '\n'); // ignore up to 32767 characters until a \n is removed
    

    A better solution : use this whenever you use std::getline() to read strings

    std::getline(std::cin >> std::ws, input); // ignore any leading whitespace characters
    

    std::ws is a input manipulator which tell std::getline() to ignore any leading whitespace characters

    source : learncpp website goto section (Use std::getline() to input text)

    hope this is helpful