C++ 文件程序赢得';不要停止显示垃圾值
我试图在文件中插入对象,然后读取对象以显示学生数据,但当它转到显示时,程序只是进入无限循环并开始显示我在构造函数中初始化的0。我根本不知道发生了什么。我正在使用VisualStudio17,以防有人怀疑。我甚至尝试在与程序相同的目录中创建一个名为Student.txt的新文件,但它无法工作。有人能解释我做错了什么吗C++ 文件程序赢得';不要停止显示垃圾值,c++,file,C++,File,我试图在文件中插入对象,然后读取对象以显示学生数据,但当它转到显示时,程序只是进入无限循环并开始显示我在构造函数中初始化的0。我根本不知道发生了什么。我正在使用VisualStudio17,以防有人怀疑。我甚至尝试在与程序相同的目录中创建一个名为Student.txt的新文件,但它无法工作。有人能解释我做错了什么吗 #include <iostream> #include <fstream> #include <cstring> using namespace
#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;
}
#包括
#包括
#包括
使用名称空间std;
//类来处理单个记录
班级学生
{
公众:
字符名[20];
国际年;
字符划分;
字符地址[50];
int-rollno;
学生()
{
strcpy_s(名称“”);
strcpy_s(地址“”);
rollno=0;
年份=0;
除法=0;
}
};
班级作业
{
公众:
void insertdata();
void printg();
};
void操作::insertdata()
{
int n;
cout>n;
流鳍;
学生obj;
打开(“Student.txt”,ios::in | ios::out | ios::binary | ios::trunc);
如果(!fin)
{
cout obj.name;
cout>obj.year;
cout>obj.division;
cout>obj.address;
fin.seekp(0,ios::结束);
fin.write((字符*)和obj,sizeof(obj));
}
fin.close();
}
void操作::printg()
{
学生obj;
fstream-fin(“Student.txt”,ios::in | ios::out | ios::binary);
fin.seekg(0,ios::beg);
fin.read((字符*)和obj,sizeof(obj));
如果(!fin)
{
可能有一些错误的事情:
- 编写像
fin.write((char*)&obj,sizeof(obj));
这样的对象是个坏主意。编译器可能会决定在任何时候为Student
对象在成员之间设置不同的填充,因此您的文件格式就像量子粒子:您不知道文件的布局
strcpy_s
接受3个参数,而不是2个参数。无论如何,不要使用它们,它们不是真正可移植的(即使它们在C标准中)
- 您的路径错误,因此文件将无法打开(正如Sam在注释中解释的)
- 即使成功打开文件,在
操作::printg()
中,您也不会读取该文件,因此不会获得任何数据
- 为什么有一个
操作
类?我想它是打算在将来扩展的,但看起来很奇怪。如果你不想有状态,请使用名称空间
您会惊讶地发现,您的程序完全无法打开文件,并且因为它不需要检查文件打开是否成功,最终结果是您观察到的垃圾。而您的程序完全无法打开文件的原因是,在C++
中,您必须已经知道,“\n”是换行符,而不是由反斜杠后跟字母n“n”组成的字符串。现在,看看您试图打开的文件的名称,看看您是否可以自己找出错误。@SamVarshavchik您是否愿意解释更多,我的意思是“\student”是否算作转义序列“\n”?每个反斜杠都是一个转义序列。@SamVarshavchik是的,谢谢。为了使路径以“/”为中心,我只是从windows资源管理器中复制了路径,甚至没有思考。我更改了代码,但现在它成功地打印了输入的数据,但仍在无限循环中。请参阅。解决了它。接受此答案。