c++ Запись в bin файл

130
12 июля 2019, 06:00

Начал писать свой оптимизатор-транслятор кода for fun. Я новичок в c++ и ЯВУ. Ввожу число с консоли. Пример 1048575. Этот код записывает в файл 00 0F FF FF:

#include <iostream> 
#include <fstream> 
using namespace std;
int main() {
    int exe[100000];
    ofstream ofile;
    ofile.open("s.bin", ios::out | ios::app | ios::binary);
    int n = 0;
    while (n < 10000) {
        cin >> n;
        int n1 = n & 255;
        int n2 = (n>>8) & 255;
        int n3 = (n>>16) & 255;
        int n4 = (n>>24) & 255;
        ofile << static_cast<char>(n4);
        ofile << static_cast<char>(n3);
        ofile << static_cast<char>(n2);
        ofile << static_cast<char>(n1);
    }
    ofile.close();
    return 0;
}

Почитал что лучше работать с binary так:

#include <iostream>
#include <fstream>
using namespace std;
int n;
int main()
{
    fstream f;
    f.open("s.bin", ios::out | ios::app | ios::binary);
    while (n < 10000) {
        cin >> n;
        f.write((char*)&n, sizeof(int));
    }
    system("pause");
    return 0;
}

Но этот код пишет число не в том порядке, получается FF FF 0F 00. 1.Как исправить второй код? 2.Или лучше пользоваться своим велосипедом в первом? - Так как порядок байт я планировал контролировать в алгоритме при генерации. 3.Почему советуют второй код для работы с binary файлами? Проявятся ли какие-то "неудобства" при разрастании кода если оставить первый код?

Answer 1

Мне непонятно, почему вам непонятно :), что вы прочтете ровно то, что запишете.

Если вы записываете число с переставленными байтами - понятно, что вы и прочтете число с переставленными байтами, и вам действительно потребуется "костыль" - либо ваш, либо написанный более эффективно, скажем, в виде ассемблерной вставки.

Вопрос - зачем вам вообще писать байты не в том порядке? Почему вы решили выбрать именно big endian, работая на машине с little endian? Так ли это принципиально "for fun" (c)?

Второе - непонятно, откуда такие "советы", использовать подход C. Как правило, выбирается что-то одно - либо подход C, либо подход C++. Говорить, что лучше, а что хуже - развести тут holywar, так что скажу только, что они абсолютно совместимы по результатам и в конечном счете работают через API операционной системы :)

READ ALSO
Undefined reference to &ldquo;Classname::Classname&rdquo; Qt C++

Undefined reference to “Classname::Classname” Qt C++

У меня есть проект, который содержит в себе два других (использую subdirs)Вызовом нужных функций из подпроектов занимается класс MainWindow, который...

160
Не возможно выйти из цикла c++

Не возможно выйти из цикла c++

Вот такой кусок кода:

139
Не отображается часть кода из *.jsp в Tomcat

Не отображается часть кода из *.jsp в Tomcat

Использую IntelliJ IDEA Ultimate и Tomcat 9:

144
OneToMany связь Spring

OneToMany связь Spring

Имеется связь OneToMany, У одного Region есть много DistrictsИмеется простой REST контроллер, который возвращает все Region, но ответ приходит

136