文件程序不会停止显示垃圾值

时间:2019-03-31 18:51:59

标签: c++ file

我试图在文件中插入对象,然后读取对象以显示学生数据,但是当它显示时,程序进入无限循环并开始显示我在构造函数中初始化的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;
}

1 个答案:

答案 0 :(得分:2)

一些错误的事情:

  • 编写fin.write((char*)&obj, sizeof(obj));之类的对象是一个坏主意。编译器可能会随时决定Student对象的成员之间具有不同的填充,因此您的文件格式就像一个量子粒子:您实际上并不知道文件的布局。

    < / li>
  • strcpy_s接受3个参数,而不是2个。无论如何,不​​要使用它们,它们不是真正可移植的(即使它们是C标准)。

  • 您的路径错误,因此该文件将不会打开(如Sam在评论中所述)。

  • 即使您成功打开文件,在operations::printg()中也不会读取文件,因此不会获得任何数据。

  • 您为什么有operations类?我想它打算在将来进行扩展,但是看起来很奇怪。如果您不打算拥有状态,请改用namespace