Różnica w sposobach zapisu pliku

0

Witam, otóż nadal głowię się nad zapisywaniem plików w c++. Po długich męczarniach udało mi się napisać kod który odpowiednio zapisuje mi w 1 pliku część tekstową, a 2 pliku część binarną (nie potrafiłem ogarnąć binarnego zapisu stringów..). I obydwa kody się różnią, dość dziwnie dla mnie. Czy ktoś mógłby mi wytłumaczyć różnice między tymi kodami, czy po prostu wynika to z zapisu tekstowego w 1 przypadku, i binarnego w 2 przypadku ? (+pytania w komentarzach)

#pragma pack(push, 1)
struct plik2
{
    std::string mob_name;
    std::string mob_type;
} zapis; // 1a.czemu tu musiałem umieścić to "zapis"
#pragma pack(pop)
#pragma pack(push, 1)
struct plik
{
 int mob_lv;
 int mob_hp;
 int mob_atk;
 int mob_def;
 int mob_speed;
 int mob_xp;
 int mob_id;
};  // 1b. a tutaj nie, czy wynika to że jedno to zapis binarny a drugi tekstowy?
#pragma pack(pop)

void zapisz(){

    ofstream pliczek;
    pliczek.open( "mobtxt.txt", ios::app);

    cin >> zapis.mob_name;

    pliczek.seekp(0,ios::end);
    pliczek << zapis.mob_name;
    pliczek.close();

/* ------------------------------------------------------ */

    ofstream ofs("baza.dat", ios::binary);
    plik* file = new plik;

    cin>>file->mob_lv;
    cin>>file->mob_hp;
    cin>>file->mob_atk;
    cin>>file->mob_def;
    cin>>file->mob_speed;
    cin>>file->mob_xp;
    cin>>file->mob_id;

    ofs.write((char*)(file), sizeof(plik));

    delete file;
}

Z góry dzięki za odpowiedź wszystkim cierpliwym ludziom (wytłumaczenie w formie jakiegoś dobrego kursu na necie, gdzie to NAPRAWDĘ jest wytłumaczone też chętnie przyjmę:P)

0
tariel36 napisał(a)

Witam, otóż nadal głowię się nad zapisywaniem plików w c++. Po długich męczarniach udało mi się napisać kod który odpowiednio zapisuje mi w 1 pliku część tekstową, a 2 pliku część binarną (nie potrafiłem ogarnąć binarnego zapisu stringów..).

A co tu do ogarniania? std::string ma metodę c_str(), która zwraca Ci ciąg znaków w postaci wskaźnika do tablicy. Tablicę tę możesz zapisać w pliku. Samej instacji std::string zapisywać nie zalecam. Był chyba wczoraj już wątek o serializacji.

tariel36 napisał(a)

I obydwa kody się różnią, dość dziwnie dla mnie. Czy ktoś mógłby mi wytłumaczyć różnice między tymi kodami, czy po prostu wynika to z zapisu tekstowego w 1 przypadku, i binarnego w 2 przypadku ? (+pytania w komentarzach)

Twoje pytania w komentarzach nie mają związku z zapisem do pliku czegokolwiek, w jakikolwiek sposób. Sam pomyśl przez chwilę, czy nazwa "zapis" (która jest po polsku) miałaby jakiś związek z zapisem w języku programowania, w którym wszystkie słowa kluczowe są w języku angielskim?

tariel36 napisał(a)
struct plik2
{
    std::string mob_name;
    std::string mob_type;
} zapis; // 1a.czemu tu musiałem umieścić to "zapis"

Nie musiałeś. Nikt Ci nie każe. To jest deklaracja z definicją.

tariel36 napisał(a)
struct plik
{
 int mob_lv;
 int mob_hp;
 int mob_atk;
 int mob_def;
 int mob_speed;
 int mob_xp;
 int mob_id;
};  // 1b. a tutaj nie, czy wynika to że jedno to zapis binarny a drugi tekstowy?

Tu jest sama deklaracja. Nie ma to związku z zapisem do plików. Struktura nie ma bladego pojęcia co Ty będziesz z nią robił, więc nie ma żadnych charakterystyk związanych z I/O.

tariel36 napisał(a)

Z góry dzięki za odpowiedź wszystkim cierpliwym ludziom (wytłumaczenie w formie jakiegoś dobrego kursu na necie, gdzie to NAPRAWDĘ jest wytłumaczone też chętnie przyjmę:P)

Podstawy języka C/C++. Jest tego mnóstwo w sieci.

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