Отправка целого числа к fstream как прямой порядок байтов

Я пишу, что функция для создает и сохранила файл WAV, но я не знаю, как послать числа, чтобы течь:

ofstream file;
file.open("sound.wav");
file << "RIFF";
file << (int) 32;
file << "WAVE";

I am trying to implement this WAVE file structure: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

и проблема - здесь продукция, похож на это:

RIFF32WAVE
0
nl ja de

3 ответы

The streaming operator << does formatted output - it converts values to text. This is not what you want for writing to a binary file format.

Вместо этого вы хотите использовать , неотформатированные функции вывода: , помещенный для единственных байтов и , пишет для многократных байтов:

file.write("RIFF", 4);

// The length field is little-endian, so write the lowest byte first
file.put(length);
file.put(length >> 8);
file.put(length >> 16);
file.put(length >> 24);

file.write("WAVE", 4);

ОБНОВЛЕНИЕ: как отмечено в комментариях, необходимо также открыть файл в режиме двоичного счета и наполнить его классическим "C" местом действия, чтобы препятствовать тому, чтобы что-либо бездельничало с байтами, которые вы пишете:

file.open("sound.wav", std::ios_base::out | std::ios_base::binary);
file.imbue(std::locale::classic());
3
добавлено
Вы забыли упоминать, что файл должен быть открыт в режиме двоичного счета и наполнил классическим местом действия. (Иначе: it' s удовольствие видеть, что кто-то предлагает чистое и правильное решение, а не просто хакерское проникновение, которое только работает с некоторыми определенными внедрениями.)
добавлено автор James Kanze, источник
Да. Под Unix нет никакого фактического различия между набором из двух предметов и текстом, но в почти всех других системах, есть. И места действия кроме классического места действия могут (и иногда делайте), транскод по вводу и выводу. (По моему скромному мнению, это должно также быть отключено в режиме двоичного счета. Но it' s нет; it' s полностью под контролем наполненного места действия.) Я don' t знают от руки, транскодирует ли какое-либо из доступных мест действия на самом деле в Unix, но возможность существует. (FWIW: there' s функция always_noconv в codecvt ; если это возвращается верный , you' ре хорошо.)
добавлено автор James Kanze, источник
Одна дополнительная деталь: и набор из двух предметов/текст различия и кодовое преобразование происходят в станд.:: filebuf . Где они не знают о том, происходят ли знаки из отформатированного вывода или неотформатированной продукции.
добавлено автор James Kanze, источник
@JamesKanze: любой из тех имеет значение к продукции неотформатированного? (Как программист Linux, пишущий код это doesn' t нужна локализация, I' ve никогда не потрудился узнавать о тех вещах подробно).
добавлено автор Mike Seymour, источник
@JamesKanze: Спасибо за объяснение, I' ve добавил те пункты к ответу.
добавлено автор Mike Seymour, источник

Необходимо открыть файл в способе двоичного выхода и затем напечатать в него.

Посмотрите этот вопрос поскольку, как сделать это.

0
добавлено

Операторы потока для отформатированного ввода/вывода (текст), не двойной. Смотрите на метод записи вместо этого. Что касается мало против проблемы с обратным порядком байтов, вы могли просто использовать htonl() функция, обеспеченная вашим OS.

0
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest