С ++ екілік файлға тікелей жазу арқылы жазылады

Мен әзірлеуші ​​кішкене файл пішімін үшін файлға 519 байт атауын шығару керек. Мен ағылшынша тұжырымдамаға сәл жаңарып отырмын. Троевизион Тарға файлының тақырыбын оқып білуіме тура келді. Бірақ шығу - бұл менің жақын таныстарым.

Негізінде, менің мәселе мынада.

Мен ағынның бір данасын ашадым және келесідей тақырыпты шығаруым керек:

typedef struct header {
    char      version;  //offset 0, length 1
    short int width;    //offset 1, length 2
    short int height;   //offset 3, length 2
    short int pathlen;  //offset 5, length 2
    char      desc[512];//offset 7, length 512
} fileHeader;

Енді барлық файлды бірінші 519 байтқа шығару керек, ал қалған бөлігі өзгереді, бұл тақырыпты файлыма көшіруге қалай қарайсыз?

Мен мұны сыныптан тыс сыныпта қолданғым келеді, бірақ мен C кітапханасында да жақсы. Мен қазір 2 сағат бойы осындамын, мен әлі ешқайда кірмедім және Google-де іздеуге тырысамын да көмектеспейді.

1

1 жауаптар

std::ofstream& operator<<(std::ofstream& out, const header& myheader) {
    out.write((char*)&myheader.version, sizeof(myheader.version));
    out.write((char*)&myheader.width, sizeof(myheader.width));
    out.write((char*)&myheader.height, sizeof(myheader.height));
    out.write((char*)&myheader.pathlen, sizeof(myheader.pathlen));
    out.write((char*)&myheader.desc, sizeof(myheader.desc));
    return out;
}
std::ifstream& operator>>(std::ifstream& in, header& myheader) {
    in.read((char*)&myheader.version, sizeof(myheader.version));
    in.read((char*)&myheader.width, sizeof(myheader.width));
    in.read((char*)&myheader.height, sizeof(myheader.height));
    in.read((char*)&myheader.pathlen, sizeof(myheader.pathlen));
    in.read((char*)&myheader.desc, sizeof(myheader.desc));
    return in;
}

int main() {
    std::cout << fileHeader << '\n';
    std::cin >> fileHeader;
    return 0;
}

Сізде ешқандай көрсеткіш жоқ болғандықтан, бұл оңай! (Назар аударыңыз, бұл тек ағындармен жұмыс істейді) Мәтінді, динамикалық жады/көрсеткіштерді/т.б. көрсету үшін тағы бір мысал

class thing {
    std::string name;
    int height;
    friend std::ofstream& operator<<(std::ofstream& out, const thing & myheader);
    friend std::ifstream& operator>>(std::ifstream& in, thing & myheader);
public: 
    thing() {}
};

std::ofstream& operator<<(std::ofstream& out, const thing & myheader) {
    thing << name.size() << ' ';
    thing.write(&name[0], name.size()) << ' ' << height;
} 
std::ifstream& operator>>(std::ifstream& in, thing & myheader) {
    int size;
    in >> size;
    myheader.name.resize(size);
    in.read(&myheader.name[0], name.size());
    return in >> myheader.height;        
} 
3
қосылды
@ user1019020: Компиляторға сыныптағы немесе құрылымдағы мүшелер арасында толтыруға рұқсат етілгенін есте сақтаңыз. Осылайша, құрылымның мөлшері оның мүшелерінің мөлшеріне тең болмауы керек.
қосылды автор Thomas Matthews, көзі
Сіз (екеуі де) дұрыс, Мен толтырылған туралы ұмытып қалдым. Сіздің құрылымыңыз емес 519 байт болуы мүмкін, тек дискіде. (Терезелерде 520 байт болады). @ user1019020: олар тәртіпте болар еді, бірақ байт нұсқасынан кейін бессмыс байт еді.
қосылды автор Mooing Duck, көзі
@ user1019020: Оқу үшін мұны істеудің қажеті жоқ. Маған қандай нұсқасы бар? Томас: Біз бұған жүгіндік.
қосылды автор Mooing Duck, көзі
Егер құрылым дұрыс пішімделмесе, бұл тастау қиындықтарға әкелуі мүмкін.
қосылды автор Pubby, көзі
Егер орау мен сөзді теңестіру туралы алаңдасаңыз, құрылымның әрбір мүшесіне оқуға және жазуға шақыру ұсынылады, бір нәрсе емес. Сіздің оффсеттеріңізден деректерді мұқият жинағыңыз келеді. Сіздің сәулетіңіз архитектурасында қысқа int шекарасына толығымен толы.
қосылды автор Erik Olson, көзі
Жауабыңызды бағалайтын болсам да, бұл қалай жұмыс істейтініне қатысты түсініктеме бергім келеді. Деректер дұрыс ретпен жазылғанына қалай сенімді бола аламын (нұсқасы алдымен еніден және т.б.). Сондай-ақ, бұл функция маған қандай да бір түрде көрінбейді. Бір нәрсе өшеді.
қосылды автор Jesse Brands, көзі
@MooingDuck Иә, мен сіздердің әдістеріңізді тексердім, содан кейін файлымды 2019 жылға дейін 5192 нөміріне немесе біреуіне дейін өзгертті. Мен сіздің жаңа ұсынысты сынап көремін. :)
қосылды автор Jesse Brands, көзі
@MooingDuck IT ЖҰМЫСЫ! Сен менің кейіпкерімсің! Қазір бұл қалай жұмыс істейтінін түсінемін. :)
қосылды автор Jesse Brands, көзі
Бір ғана нәрсе, шын мәнінде, оқуға тура келді. char buffer [519]; ifs.read (буфер, 519); қысқа int ені = (қысқа int) аралық [1] | қысқа int height = (қысқа int) буфері [3] | (((қысқа int) буфері [4]) << 8); Бірақ содан кейін ол жұмыс істейді. :)
қосылды автор Jesse Brands, көзі