C ++ Влияет ли порядок байтов на функции чтения и записи в fstream? - PullRequest
1 голос
/ 17 апреля 2020

Я учусь писать / читать из двоичных файлов, и я хочу, чтобы мои файлы были доступны для чтения на любой машине, которая поддерживает C ++ 17. Поэтому у меня возникла ужасающая мысль: что если затронуты read () и write () по порядку номера машины?

Например: я запускаю этот код на машине с прямым порядком байтов,

#include <iostream>
#include <fstream>
#include <cstdint>

int main() {

    std::ofstream Output("Hey.txt", std::ofstream::out | std::ofstream::binary);

    if (Output.is_open()) {
        int16_t i = 42;
        Output.write((const char*)&i, 2);
    }

}

Затем я передаю Hey.txt маленькой машине с порядком байтов, затем запускаю этот код на машине,

#include <iostream>
#include <fstream>
#include <cstdint>

int main() {

std::ifstream Input("Hey.txt", std::ifstream::in | std::ifstream::binary);

    if (Input.is_open()) {
        int16_t i;
        Input.read((char*)&i, 2);
        std::cout << i << std::endl;
    }

}

Будет ли программа печатать 42? Или fstream обрабатывает разницу порядка байтов? Если нет, то есть ли способ предотвратить проблемы с порядком байтов?

Спасибо за ваше внимание.

1 Ответ

4 голосов
/ 17 апреля 2020

Два простых правила:

  1. Если вы собираетесь записывать двоичные данные в файл, документируйте формат файла.

  2. Когда вы записываете двоичные данные в файл, убедитесь, что записываемые вами байты соответствуют требованиям формата файла.

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

Не используйте приведение типа (char*)&i, потому что тогда байты будут содержать любой формат, который будет использовать собственная система для 16-разрядные целые числа, и это даже не гарантируется (в соответствии со стандартом C ++) стабильностью при выполнении одного и того же кода в той же системе.

...