Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

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

Допустим, у меня есть структура
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(); }
Но она работает неправильно.


Ответ

Вот ваша структура
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 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 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 vSchool, unsigned long mark) { cout<<"Surname "< } }

Комментариев нет:

Отправить комментарий