Файловая программа не перестанет отображать значения мусора - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь вставить объект в файл, а затем прочитать объект для отображения данных ученика, но когда он переходит к отображению, программа просто идет в бесконечном цикле и начинает отображать 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 Ответ

2 голосов
/ 31 марта 2019

Несколько неправильных вещей:

  • Написание объектов типа fin.write((char*)&obj, sizeof(obj)); - плохая идея. Компилятор может решить в любой момент по-разному заполнять элементы для ваших объектов Student, поэтому ваш формат файла подобен квантовой частице: вы не знаете, как был создан файл.

  • strcpy_s принимает 3 параметра, а не 2. Во всяком случае, не используйте их, они не очень переносимы (даже если они в стандарте C).

  • Ваши пути неверны, поэтому файл не откроется (как поясняет Сэм в комментарии).

  • Даже если вам удалось открыть файл, в operations::printg() вы не читаете файл, поэтому вы не получите никаких данных.

  • Почему у вас operations класс? Я предполагаю, что это должно быть расширено в будущем, но кажется странным. Если вы не собираетесь иметь состояние, используйте вместо него namespace.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...