Γιατί διαβάζοντας και γράφοντας σε ένα δυαδικό αρχείο δεν λειτουργεί όπως θα περιμένατε;

ψήφοι
-1

Είμαι προσπαθεί να αντικαταστήσει ένα διπλό τιμή που βρίσκεται στο 32ο byte στο δυαδικό αρχείο. Στο παρακάτω ρύθμιση, το μέγεθος της MyStructείναι 24 bytes. Ως εκ τούτου, το 32ο byte στο αρχείο θα πρέπει να είναι η Weightμεταβλητή μέλος του 2ου struct. Αυτή τη στιγμή, όταν εκτελώ, έχω πάρει το παράξενο εξόδου. Περιμένω 2ο μου struct να έχει η νέα τιμή βάρους 250 αντί 200:

#include <iostream>
#include <fstream>

using namespace std;

struct MyStruct
{
    int Grade;
    double Weight;
    char Gender;
};

int main()
{
    MyStruct* lStruct = new MyStruct{ 1, 100, 'M' };
    MyStruct* lStruct2 = new MyStruct{ 2, 200, 'F' };;

    fstream InFile;
    InFile.open(test.txt, ios::in | ios::out | ios::binary);
    InFile.write(reinterpret_cast<char*>(lStruct), sizeof(MyStruct));
    InFile.write(reinterpret_cast<char*>(lStruct2), sizeof(MyStruct));


    InFile.seekp(32, ios::beg);
    double Weight = 250;
    InFile.write(reinterpret_cast<char*>(&Weight), sizeof(double));

    InFile.seekg(0, ios::beg);
    InFile.read(reinterpret_cast<char*>(lStruct), sizeof(MyStruct));
    InFile.seekg(24, ios::beg);
    InFile.read(reinterpret_cast<char*>(lStruct2), sizeof(double));

    cout << lStruct->Grade<< endl;
    cout << lStruct->Weight << endl;
    cout << lStruct->Gender<< endl;
    cout << endl;

    cout << lStruct2->Grade<< endl;
    cout << lStruct2->Weight << endl;
    cout << lStruct2->Gender<< endl;
    cout << endl;

    return 0;
}

Παραγωγή:

1

100

Μ

2

200

φά

Ποιο είναι το πρόβλημα?

Ερώτηση Bonus: είναι seekp(32, ios::beg)ισοδύναμο με seekp(-16, ios::end); (μπορώ να χρησιμοποιήσω το αρνητικό μακριά από το τέλος);

Δημοσιεύθηκε 09/10/2019 στις 19:01
πηγή χρήστη
Σε άλλες γλώσσες...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more