Я неправильно концентрирую эти массивы символов? - PullRequest
0 голосов
/ 14 октября 2018

Я пытался создать midi-файл с нуля с помощью c ++.Я разделяю разные чанки (и части чанков) на разные символьные массивы.

Мой код:

#include <iostream>
#include <fstream>
#include <cstring>

int main(int, char* []) {
    std::ofstream MIDIfile ("example.mid")
    char header[] = { /* hex data */ };
    char track_header[] = { /* hex data */ };
    char track_data[] = { /* hex data */ };
    MIDIfile << strcat(header, strcat(track_header, track_data));
    MIDIfile.close();
    return 0;
}

Моя единственная проблема заключается в том, что при записи файла только 8 из81 байт написано.Для этого есть причина?Я делаю что-то не так?

С уважением, shadowstalker75

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Функция в формате operator<< для char массивов или указателей предназначена для печати с нулевым окончанием строк .Если ваши «шестнадцатеричные данные» содержат любые нули (двоичные нули, 0, а не символ '0'), то это будет действовать как терминатор.

Это не говоря уже о переполнениях буфера, которые у вас есть, так как выдобавить в массив фиксированного размера, который имеет определенный размер для данных, с которыми вы его инициализируете.

Прежде всего, решение не использовать произвольные двоичные данные в качестве строк (функция strcat также ожидает, что данные будут строкой с нулевым символом в конце), но как необработанные данные.Во-вторых, вам нужно использовать функцию write для записи произвольных данных.

0 голосов
/ 14 октября 2018

Вам нужно узнать, что делает strcat().Эта линия никогда не будет работать.На самом деле, даже лучше, НИКОГДА НЕ ИСПОЛЬЗОВАТЬ strcat().Это дерьмо.

MIDIfile << strcat(header, strcat(track_header, track_data));

У вас есть двоичные буферы шестнадцатеричных данных, просто используйте функцию write():

MIDIfile.write(header, sizeof(header));
...

и записывайте один буфер за раз.

...