Cela peut sembler un peu étrange ou la question peut être sortingviale, mais j’ai passé la majeure partie de ma vie à programmer en PHP (ouais, je sais à quoi ça ressemble). Ainsi, lorsque je suis passé au C ++, il y a des choses que je ne connais pas bien (cause des habitudes php).
Donc, je charge les données d’en-tête wav en utilisant struct. Les valeurs sont définies en tant que type uint8_t:
typedef struct WAV_HEADER { uint8_t RIFF[4]; // RIFF uint8_t WAVE[4]; // WAVE }
Je dois les comparer avec des chaînes de quatre lettres pour quelque chose comme ça:
if(wavHeader.RIFF[0] . wavHeader.RIFF[1] . wavHeader.RIFF[2] . wavHeader.RIFF[3] == 'RIFF') { do sth }
Cela devrait être facile de vérifier si le fichier chargé est un fichier Wave (* .wav). Merci pour toute aide.
Les chaînes en C et C ++ ont une terminaison nulle . RIFF
et WAVE
ne sont pas techniquement des chaînes de style C, car il n’existe pas de terminateur null, vous ne pouvez donc pas utiliser une simple chaîne de style C / C ++, comme strcmp
. Vous pouvez toutefois les comparer de différentes manières avec les chaînes que vous souhaitez:
if (header.RIFF[0] == 'R' && header.RIFF[1] == 'I' && header.RIFF[2] == 'F' && header.RIFF[3] == 'F') { // .. }
if (strncmp((const char*)header.RIFF, "RIFF", 4) == 0) { // .. }
if (memcmp(header.RIFF, "RIFF", 4) == 0) { // .. }
strncmp
memcmp
strncmp
ou memcmp
. Ils finissent par faire la même chose, mais sémantiquement, strncmp
est une fonction de comparaison de chaînes qui rend peut-être le code plus clair.
Pour strncmp
voir ici . Pour memcmp
voir ici .