Jak zapisac do pliku binarnego dane z wektora?

0

jak w temacie.
Mam strukture o zmiennych:
char[50];
char[50];
int;
oraz wektor o tej strukturze. Dane z pliku wrzucilem do wektora, i po sortowaniu chcialbym te dane wrzucic do drugiego pliku binarnego. Jak to zrobic?

0
vector<osoba> elo;
	osoba jakas;
	ofstream plik2("dane.dat", ios::binary | ios::app);
	cout << "Podaj imie, nazwisko, wzrost" << endl;
	cin >> jakas.imie >> jakas.nazwisko >> jakas.wzrost;
	plik2.write((char*)(&jakas), sizeof(jakas));
	plik2.close();

	ifstream plik("dane.dat", ios::binary);
	for (int i = 1;; i++) {
		plik.read(reinterpret_cast<char*>(&jakas), sizeof(jakas));
	 if (plik.eof()) break;	 
	 elo.push_back(jakas);
	 sort(elo.begin(), elo.end());
	}
	plik.close();
0

Wg jakiego kryterium sortujesz te osoby?

Ja raczej zrobiłbym to tak:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <cctype>

struct Person {
    enum {BUFFER_SIZE = 50};
    char firstname[BUFFER_SIZE];
    char surname[BUFFER_SIZE];
    unsigned int height;
    
    Person(const char *fname, const char *sname, unsigned int h) : height(h) 
    {
        strncpy(firstname, fname, BUFFER_SIZE);
        strncpy(surname, sname, BUFFER_SIZE);
        
        firstname[BUFFER_SIZE - 1] = '\0';
        surname[BUFFER_SIZE - 1] = '\0';
    }
};

int main(int argc, char *argv[]) {
    Person p1("John", "Smith", 180);
    Person p2("Ann", "Watts", 168);
    
    std::vector<Person> people {p1, p2};
    
    std::sort(people.begin(), people.end(), [](const Person &a, const Person &b) {
        return strncmp(a.surname, b.surname, Person::BUFFER_SIZE);
    });
    
    std::ofstream file ("data.bin", std::ios::binary);
    for (const auto &p : people) {
        file.write(reinterpret_cast<const char*>(&p), sizeof p);
    }
    file.close();
    
    return 0;
}
1

Najlepiej nie robić tego w ten sposób.
Obecne standardy kodowania zachęcają do korzystania z xml-a, JSon-a, CSV
i w razie potrzeby spakowania takiego pliku (najlepiej zip-em albo Zstandard).
Takie rozwiązanie łatwiej się utrzymuje i skaluje w razie potrzeby.

Obecnie nowe formaty danych binarnych wprowadza się jedynie dla skomplikowanych i dużych danych (zwykle chodzi o media audio video). Twój przypadek raczej pod to nie podpada.

Tu znajdziesz przykład jak szybko i prosto zapisywać i odczytywać dane w xml-u: https://4programmers.net/Forum/C_i_C++/300163-pytanie_o_strukture_danych_w_pliku_txt?p=1423367#id1423367

1 użytkowników online, w tym zalogowanych: 0, gości: 1