Как считывать структуру из файла?

187
23 марта 2017, 21:46

Допустим, у меня есть структура

struct SCHOOL
{
    unsigned long mark;
    char subject[20];
    char surname[20];
    short age;
};

Для записи её в файл я написал функцию

SCHOOL setInfo()
{
    SCHOOL s;
    ofstream fout("out.txt", ios::app);                 
    cout << "mark: "; cin >> s.mark;
    cout << "subject: "; cin >> s.subject;
    cout << "surname: "; cin >> s.surname;
    cout << "age: "; cin >> s.age;
    fout.write((char*)&s, sizeof(SCHOOL));      
    fout.close();                               
} 

Как правильно написать функцию для считывания и потом работать с элементами структуры, например, вывести все фамилии с оценками 9?

Я написал такую функцию,

void getInfo()
{
    SCHOOL s;
    ifstream fin("out.txt", ios::in);
    while (!fin.eof())
    {
        fin.read((char*)&s, sizeof(SCHOOL));
    }
    fin.close();
}

Но она работает неправильно.

Answer 1

Вот ваша структура

struct School
{
    unsigned long mark;
    char subject[20];
    char surname[20];
    short age;
};

Вот так лучше писать и читать

    void setInfo(School& school)
    {
        ofstream fout("out.txt", ostream::binary); //инициализация потока файла                
     //Заполнили структурку
        cout << "mark: "; cin >> school.mark;
        cout << "subject: "; cin >> school.subject;
        cout << "surname: "; cin >> school.surname;
        cout << "age: "; cin >> school.age;
//записали
        fout.write((char*)&school, sizeof(School));      
        fout.close();                               
    } 
    void getInfo(School& school)
    {
        ifstream fin("out.txt", ios::in);
        while (!fin.eof())
        {
            fin.read((char*)&school, sizeof(School));
        }
        fin.close();
    }
    int main()
    {
    School school;
    //так пишем
    setInfo(school);
    //так читаем
    getInfo(school);
    }

это что касается считывания из файла , далее для работы с множественными объектами струтктуры необходио использовать контейнеры, напрмиер vector или list.

вот пример функции которая запишет в файл все ваши объекты

void recAllSchoolObj(vector <School> vSchool)
{
   ostream fout("out.txt", ostream::binary)
   for(int i =0; i<=vSchool.size; ++i)
   {
     fout.write((char*)&vSchool.at(i), sizeof(School));
   }
    fout.close();
}

вот пример который прочитает

void readAllSchoolObj(vector <School> vSchool)
{
   School school;
  istream fin("out.txt");
  while(!fin.eof)
  {
    fin.read((char*)&school, sizeof(School));
     vSchool.push_back(school);  
   }
   fin.close;
}

поиск всех фамилий с одной оценкой

void findMark(vector <School> vSchool, unsigned long mark)
{
  cout<<"Surname "<<endl;
  for(int i =0; i<=vSchool.size; ++i)
  { 
    if(vSchool.at(i).mark == mark)
     cout<<vSchool.at(i).surname<<endl;
   }
}
READ ALSO
Проблемы с IPv6 при создании соединения

Проблемы с IPv6 при создании соединения

Проблема заключается в следующем: написал общую ф-ию initNetAddressFromEndpoint которая по IP адресу (IPv4, IPv6, доменное имя) и порту отдает нам структуру...

241
Как переделать код, чтобы не вызывать функцию inline.

Как переделать код, чтобы не вызывать функцию inline.

Есть код, который нужно переделать, но пока не силен в jsСейчас код вызывается inline через onclick, а мне нужно, чтобы он вызывался непосредственно...

169
Почему не отображаться мой сайт в Google Knowledge Graph?

Почему не отображаться мой сайт в Google Knowledge Graph?

Почему мой сайт не отображается справа при поиске по слову Fashion Flash?

203
Функция JavaScript для параметризации стринга

Функция JavaScript для параметризации стринга

Ребята помогите мне плиз, хочу чтобы мой output был robin-singh-from-usaПока, что мой output это массив ["robin", "singh", "from", "usa

267