Нечитаемый файл - PullRequest
0 голосов
/ 25 мая 2018

Я использую код из онлайн на файловых структурах.Я сталкиваюсь с трудностью решения проблемы, связанной со способностью прочитать то, что я записываю в файл. [Именно так введенные данные сохраняются в файле.

Как сделать его читабельным?

enter image description here

код:

void write_student() {
  student st;
  int nu, fla = 0;
  ofstream outFile;
  outFile.open("stu1.txt", ios::app);
  cout << "Enter roll number";
  cin >> nu;
  cout << "Checking for constraint violation......";
  fla = pkey(nu);
  if (fla == 0) {
    st.getdata();
    outFile.write((char *)&st, sizeof(student));
    outFile.open("stu1.txt", ios::app);
    outFile.close();
    cout << "\n\nStudent record Has Been Created ";
    cin.ignore();
  } else
    cout << "\n\nPRIMARY KEY CONSTRAINT VIOLATED\n";
  getch();
}
void student::getdata() {
  cout << "\nConfirm The roll number of student ";
  cin >> rollno;
  cin.ignore();
  cout << "\n\nEnter The Name of student ";
  cin >> name;
  cin.ignore();
  cout << "\nEnter The marks in Cryptography out of 100      : ";
  cin >> p_marks;
  cin.ignore();
  cout << "\nEnter The marks in File Structure out of 100    : ";
  cin >> c_marks;
  cin.ignore();
  cout << "\nEnter The marks in Software Testing out of 100  : ";
  cin >> m_marks;
  cin.ignore();
  cout << "\nEnter The marks in Operating System out of 100  : ";
  cin >> e_marks;
  cin.ignore();
  cout << "\nEnter The marks in Python out of 100            : ";
  cin >> cs_marks;
  cin.ignore();
}

Это частькод, где добавлены оценки ученика.Я хочу, чтобы иметь возможность читать содержимое stu1.txt.Спасибо за помощь !!

Мой student класс определяется как

class student 
{ 
    int rollno; 
    char name[50]; 
    int p_marks, c_marks, m_marks, e_marks, cs_marks; 
    float per; 
    char grade; 
    void calculate();

    public: 
    void getdata(); 
    void getdata1(); 
    void showdata();    
    void show_tabular(); 
    int retrollno(); 
};

1 Ответ

0 голосов
/ 25 мая 2018

Вы пишете ученику полностью как двоичные данные и читаете его из файла ASCII.

Простым решением было бы реализовать функцию writeToFile в классе ученика:

class student 
{ 
    int rollno; 
    char name[50]; 
    int p_marks, c_marks, m_marks, e_marks, cs_marks; 
    float per; 
    char grade; 
    void calculate();

    public: 
    void getdata(); 
    void getdata1(); 
    void showdata();    

    void write(std::ofstream& file); //<--- implement writing function

    void show_tabular(); 
    int retrollno(); 
}; 

void student::write(std::ofstream& file){
    if(!file.is_open())
        return;
    file << "Name    : " << std::string(name) << "\n";
    file << "Roll no.: " << rollno << "\n";

    file << "Marks   : " << "\n";
    file << "\tp: " << p_marks "\n";  
    file << "\tp: " << c_marks << "\n";  
    file << "\tp: " << m_marks << "\n";  
    file << "\tp: " << e_marks << "\n";  
    file << "\tp: " << cs_marks << "\n"; 

    file << "Per.   : " << per << "\n";
    file << "Grade  : " << grade<< "\n";
}

Но следите за именем массива char.Если нет строкового завершения (\ 0), оно будет записывать мусор после имени (при условии, что имя короче 50 символов).

...