У меня есть задача написать двоичный файл на 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;}