Как вывести в C ++ массивы байтов в двоичные файлы без утечки памяти? - PullRequest
0 голосов
/ 11 июня 2018

У меня есть задача написать двоичный файл на C ++, то есть сообщение с некоторыми научными параметрами, в виде метаданных (заголовок) и научных данных (тело).После некоторых поисков, проб и ошибок, как это сделать, я решил использовать структуру массивов символов и strcpy в них шестнадцатеричное представление битов.

Дело в том, что, хотя это работало на одних компьютерах, где я его тестировал, на других это дало мне ошибки, связанные с памятью.Последняя версия:

* Ошибка в `./WriteBinary.exe ': размер поврежден по сравнению с предыдущим размером: 0x0000000001189e50 *

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

// housekeeping TM structure
// the PreHeader structure
struct PreHeader {
    char prehead1[4] ;
    char prehead2[2] ;
    char prehead3[2] ;
    char prehead4[3] ;
    char prehead5[1] ;
    char prehead6[5] ;
    char prehead7[1] ;
}
;
// the Header structure
struct Header {
    char head1[4] ;
    char head2[1] ;
    char head3[1] ;
} ;
// the Body structure
struct Body {
    char bd1[61] ;
} ;

int main(int argc, char *argv[]){

int filenum = atoi(argv[3]);    // a variable to keep the file number
srand(time(NULL) + filenum);  // give a new random set at the present time + offset with the file number for different array generation
char* fileName = argv[1];   // the second argument [1] of the main function is the file name passed by the bash shell script

// setup the file to redirect the output to
ofstream outputFile;
outputFile.open(fileName,ios::binary);

// set the number of telemetry packets
size_t num_tm = atoi(argv[2]);  // number of telemetry packets to be written to the same file

// structures instances
vector<PreHeader> HK_PreHead(num_tm) ;
vector<Header> HK_Head(num_tm) ;
vector<Body> HK_Bd(num_tm) ;

// cycle through the telemetry packets
for ( int i=0; i<num_tm; i++ ) {
    // assign the PreHeader (constant for now)
    strcpy( HK_PreHead[i].prehead1, "\x55\x35\xF8\xA3" );
    strcpy( HK_PreHead[i].prehead2, "\x00\x00" );
    strcpy( HK_PreHead[i].prehead3, "\x97\x26" );
    strcpy( HK_PreHead[i].prehead4, "\x00\x00\x00" );
    strcpy( HK_PreHead[i].prehead5, "\x44" );
    strcpy( HK_PreHead[i].prehead6, "\x00\x00\x00\x00\x00" );
    strcpy( HK_PreHead[i].prehead7, "\x01" );
    outputFile.write (reinterpret_cast<const char*>(&HK_PreHead[i]),sizeof(HK_PreHead[i]));    // outputs the PreHeader to the file
    // assign the Header (constant for now)
    strcpy( HK_Head[i].head1, "\xE\x44\xC0\x22" );
    strcpy( HK_Head[i].head2, "\x00" );
    strcpy( HK_Head[i].head3, "\x3D" );
    // assign the Body (constant for now)
    outputFile.write (reinterpret_cast<const char*>(&HK_Head[i]),sizeof(HK_Head[i]));    // outputs the Header to the file
    for ( int j=0; j< sizeof(HK_Bd[i]); j++ ) {
        HK_Bd[i].bd1[j] = 0x11 ;
    }
    outputFile.write (reinterpret_cast<const char*>(&HK_Bd[i]),sizeof(HK_Bd[i]));    // outputs the Body to the file
}

outputFile.close();

return 0;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...