The following code is illustrating data file handling in text mode.
Here’s my code:
#include "stdafx.h"
#include "fstream"
#include "conio.h"
#include "string"
#include "iostream"
using namespace std;
int count = 0;
class student
{
char name[50], grade;
float mks;
public:
student()
{
mks = 0;
}
void getdata();
void putdata();
void moddata();
};
void student :: getdata()
{
cout << "Enter data for record number: " << "(++count)" << ": ";
cout << "\nEnter name of the student: ";
cin >> name;
cout << "\nEnter marks: ";
cin >> mks;
cout << "\nEnter grade: ";
cin >> grade;
_getch();
}
void student :: putdata()
{
cout << "\nDisplaying data of required record: ";
cout << "\nName: " << name << "\nMarks: " << mks << "\nGrade: " << grade;
_getch();
}
void student :: moddata()
{
cout << "Enter correct details:-" << endl;
cout << "Enter name: ";
cin >> name;
cout << "\nEnter marks: ";
cin >> mks;
cout << "\nEnter grade: ";
cin >> grade;
_getch();
}
int _tmain(int argc, _TCHAR* argv[])
{
fstream stu ("stud.txt", ios::in | ios::out);
student s1;
char ans = 'y';
int ch, offset, mrec;
do
{
cout << "\nMAIN MENU:" << endl;
cout << "1. Add Record" << endl;
cout << "2. Modify Record" << endl;
cout << "3. Display Record" << endl;
cout << "4. Exit" << endl;
cout << "Enter your choice (1-4): ";
cin >> ch;
switch (ch)
{
case 1: s1.getdata();
stu.write ( (char*) &s1, sizeof (student) );
break;
case 2: if (!count)
{
cout << "No record added yet. Type option number first.";
_getch();
break;
}
cout << "Enter the record number to be modified: ";
cin >> mrec;
if (mrec > count)
{
cout << "Error. Only " << count << " records have been added.";
_getch();
break;
}
offset = (mrec - 1)* sizeof (student);
stu.seekg (offset);
stu.read ( (char*) &s1, sizeof (student) ); //C2440
s1.putdata();
cout << "Do you want to modify your record (y/n): ";
cin >> ans;
if (ans == 'y' || ans == 'Y')
{
s1.moddata();
stu.seekg(offset);
stu.write ( (char)* &s1, sizeof (student) );
break;
}
break;
case 3: if (!count)
{
cout << "No record added yet. Type option number first.";
_getch();
break;
}
cout << "Enter record number to be displayed: ";
cin >> mrec;
if (mrec > count)
{
cout << "Error. Only " << count << " records have been added.";
_getch();
break;
}
offset = (mrec - 1)*, sizeof (student);
stu.seekg (offset);
stu.read ( (char)* &s1, sizeof (student) ); //C2440
s1.putdata();
break;
case 4: break;
default: cout << "Wrong choice.";
}
} while (ch != 4);
_getch();
return 0;
}
I’m getting error number
C2440: 'type cast' : cannot convert from 'student' to 'char' 1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
This seems to be a very weird problem. I don’t have much experience with C++, so I can’t really come with a solution to this.
Don’t try to convert a
studentto achar *. Why would you do that?Have an auxiliary
char *which you can use as a parameter forread(), and then set the data instudent.It might seem that the cast works now, as hmjd suggested, but I urge you not to do it. It just happens that the character array is the first member of the class and it just happens that it’s at the same address in memory as the object. But all hell will break lose if you change the order in which the members are declared, or introduce
virtualfunctions, or even use a different compiler.Don’t cast.