Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 文件程序赢得';不要停止显示垃圾值_C++_File - Fatal编程技术网

C++ 文件程序赢得';不要停止显示垃圾值

C++ 文件程序赢得';不要停止显示垃圾值,c++,file,C++,File,我试图在文件中插入对象,然后读取对象以显示学生数据,但当它转到显示时,程序只是进入无限循环并开始显示我在构造函数中初始化的0。我根本不知道发生了什么。我正在使用VisualStudio17,以防有人怀疑。我甚至尝试在与程序相同的目录中创建一个名为Student.txt的新文件,但它无法工作。有人能解释我做错了什么吗 #include <iostream> #include <fstream> #include <cstring> using namespace

我试图在文件中插入对象,然后读取对象以显示学生数据,但当它转到显示时,程序只是进入无限循环并开始显示我在构造函数中初始化的0。我根本不知道发生了什么。我正在使用VisualStudio17,以防有人怀疑。我甚至尝试在与程序相同的目录中创建一个名为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;
}
#包括
#包括
#包括
使用名称空间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资源管理器中复制了路径,甚至没有思考。我更改了代码,但现在它成功地打印了输入的数据,但仍在无限循环中。请参阅。解决了它。接受此答案。