Возникли проблемы при записи структуры в двоичный файл C ++ - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь создать код, который принимает структуру, запрашивает информацию о пользователе и помещает данные в двоичный файл с именем «output», чтобы его можно было прочитать. Я пытался сделать это с моим кодом, но он не работал. Кто-нибудь может мне помочь исправить это и сказать мне, что я делаю неправильно? Вот мой код, над которым я работаю.

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>
#include <iomanip>
#include <stdio.h>  
#include <string.h> 
using namespace std;

const int NAME_SIZE = 20;

struct Student{
    char fname[NAME_SIZE]; 
    int id; 

    };

int main() {
    int choice;
    fstream file; 
    Student person;

cout << "Populate the records of the file." << endl;
        file.open("output", ios::out | ios::binary);
        cout << "Populating the record with information."<< endl;      
        cout << "Enter the following data about a person " << endl;
        cout << "First Name: "<< endl;
        cin.getline(person.fname, NAME_SIZE);
        cout << "ID Number: "<< endl;
        cin >> person.id;
        file.write(reinterpret_cast<char *>(&person), sizeof(person));
        file.close();       
return 0;
}

Буду очень признателен за любую помощь

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

правильный способ - определить оператор << и оператор >> для студента. Тогда это просто пирог, связанный с сохранением и чтением структуры.

std::ostream & operator<<(std::ostream & os, Student const & rhs)
{
   for(int i=0; i<NAME_SIZE; ++i)
   {
      os << rhs.fname[i];
   }
   os << id;
   return os;
}


std::istream & operator>>(std::istream & is, Student & rhs)
{
   for(int i=0; i<NAME_SIZE; ++i)
   {
      is >> rhs.fname[i];
   }
   is >> id;
   return is;
}

Поэтому, когда вам нужно сохранить в файл, вы просто делаете:

file << person;

, когда вам нужно прочитать из него:

file >> person;

PS: Я бы предложил сделать реализацию оператора более надежной, чем это, возможно, с помощью специальных маркеров, чтобы вы могли обнаружить проблемы при чтении из файла.

0 голосов
/ 20 апреля 2020

Вы смешиваете между необработанными двоичными данными и строковыми данными. Вы пишете имя файла, которое может содержать непечатаемые символы после имени, если имя короче NAME_SIZE. Также int id записывается как целое число, которое нельзя распечатать.

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

Если вы хотите хранить данные как читаемый текст, вам сначала нужно будет сериализовать данные, но вы не сможете загрузить их простым read

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