
C++ praca so stringami a polami char v binarnom subore
Zapisujem data binarneho suboru binarny subor ma hlavicku.
Na zaciatku hlavicky je ID co je sada znakov konstanta podla ktorych viem rozlisit ten format suboru.
Prvy problem nastava uz pri definicii konstanty prekladac C++ mi neumoznuje definovat konstantu s presnou velkostou. NiecoXY ma 7 znakov ale prekladac mi dovoli pole inicializovat iba na 8 znakov. Chce tam totiz pridat ukoncovaci znak '\0'. Lenze ja viem ze pole nakov v tomto formate suboru bude mat presne 7 znakov a ukoncovaci znak \0 je tam uplne zbytocny.
const char XYFileID[7] = "NiecoXY"; // toto mi prekladac nedovoli
const char XYFileID[8] = "NiecoXY"; // musim definovat toto
Dalej chcem nadefinovat hlavicku binarneho suboru takto:
struct XYFileHeader {
const char Id[7] = XYFileID; // rovnaky problem ako v prvom pripade
float Width;
float Height;
float DpiX;
float DpiY;
char Codec[10];
};
Ale opat je tam problem s ukoncovacim znakom. Prekladac C++ mi ho tam chce za kazdu cenu nanutit. Takze musim to riesit takto:
const char XYFileID[8] = "NiecoXY";
struct XYFileHeader {
char Id[7];
float Width;
float Height;
float DpiX;
float DpiY;
char Codec[10];
XYFileHeader() {
strcpy(Id, XYFileID);
}
};
co prinasa 2 problemy: Id vramci struktury neni const. Musim tie znaky kopirovat az v konstruktore cez strcpy co samozrejme neni tak samovysvetlujuce. Poznate nejaky lepsi sposob? Ale prosim prehladny. Toto za prehladne nepovazujem:
const char XYImageID[7] = { 'N', 'i', 'e', 'c', 'o','X', 'Y' };
Môžeš použiť std:array<char, 7>, na inicializáciu môžeš použiť std:to_array (alebo vlastný constexpr), ktorý vráti toto pole nainicializované podľa poľa znakov, čiže budeš môcť použiť priamo reťazec.