我试图在文件中插入对象,然后读取对象以显示学生数据,但是当它显示时,程序进入无限循环并开始显示我在构造函数中初始化的0.我只是没有得到什么正在发生。我正在使用Visual Studio 17,以防万一有人想知道。我什至尝试在与该程序相同的目录中创建一个名为Student.txt的新文件,但无法正常工作。有人可以向我解释我在做什么错吗?
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
//class to handle individual record
class Student
{
public:
char name[20];
int year;
char division;
char address[50];
int rollno;
Student()
{
strcpy_s(name," ");
strcpy_s(address, " ");
rollno = 0;
year = 0;
division = 0;
}
};
class operations
{
public:
void insertdata();
void printg();
};
void operations::insertdata()
{
int n;
cout << "\nEnter how many student data you want to insert:";
cin >> n;
fstream fin;
Student obj;
fin.open("Student.txt", ios::in | ios::out | ios::binary| ios::trunc);
if (!fin)
{
cout<<"\nFILE NOT Opened!";
}
for (int v = 0; v < n; v++)
{
cout << "\nEnter Roll no:";
cin >> obj.rollno;
cout << "\nEnter Name:";
cin.ignore();
cin >> obj.name;
cout << "\nEnter year:";
cin >> obj.year;
cout << "\nEnter division:";
cin >> obj.division;
cout << "\nEnter Address:";
cin.ignore();
cin >> obj.address;
fin.seekp(0, ios::end);
fin.write((char*)&obj, sizeof(obj));
}
fin.close();
}
void operations::printg()
{
Student obj;
fstream fin("Student.txt", ios::in | ios::out | ios::binary);
fin.seekg(0, ios::beg);
fin.read((char*)&obj, sizeof(obj));
if (!fin)
{
cout << "\n FIle doenst exist";
}
while (!fin.eof())
{
cout << "\n" << obj.name;
cout << "\n" << obj.year;
cout << "\n" << obj.division;
}
fin.close();
}
int main() {
operations obj;
obj.insertdata();
obj.printg();
system("pause");
return 0;
}
答案 0 :(得分:2)
一些错误的事情:
编写fin.write((char*)&obj, sizeof(obj));
之类的对象是一个坏主意。编译器可能会随时决定Student
对象的成员之间具有不同的填充,因此您的文件格式就像一个量子粒子:您实际上并不知道文件的布局。
strcpy_s
接受3个参数,而不是2个。无论如何,不要使用它们,它们不是真正可移植的(即使它们是C标准)。
您的路径错误,因此该文件将不会打开(如Sam在评论中所述)。
即使您成功打开文件,在operations::printg()
中也不会读取文件,因此不会获得任何数据。
您为什么有operations
类?我想它打算在将来进行扩展,但是看起来很奇怪。如果您不打算拥有状态,请改用namespace
。