Si vous travaillez avec une entrée non formatée, vous devriez probablement lire directement sous forme binaire. Habituellement, vous utiliseriez une directive spécifique au compilateur pour créer des structures de données sans remplissage, puis simplement lire/écrire à partir d'un fichier.
// Gcc
#pragma pack(1) // option 1: pragmas
struct frame {
std::uint32_t header;
std::uint16_t data[8];
} __attribute((packed)); // option 2: packed attribute
#pragma pack(0)
bool operator==(data const & lhs, data const & rhs)
{
bool result = lhs.header == rhs.header;
for (int i = 0; i < 8; ++i)
{
result &= lhs.data[i] == rhs.data[i];
}
return result;
}
int main()
{
frame data = { 10, 1, 2, 3, 4, 5, 6, 7, 8 };
std::ofstream out("data.bin", ofstream::binary);
out.write(reinterpret_cast<char*>(&data), sizeof(data));
out.close();
std::ifstream in("data.bin", ifstream::binary);
frame readed;
in.read(reinterpret_cast<char*>(&readed), sizeof(readed));
in.close();
std::cout << (readed == data) << std::endl; // 1
}
La directive du compilateur pour désactiver le rembourrage pour VS peut être différent (je crois que la directive pragma fonctionne aussi bien dans gcc et VS, mais je l'ai toujours utilisé l'attribut).
Voulez-vous avoir une entrée formatée (forme textuelle) ou lire à partir d'une représentation binaire des données (les noms de champs ressemblent à un message) –
les données représentées sont binaires. Chaque paquet de données commence par une séquence d'en-tête et contient 8 échantillons de données. Je veux transformer cela en 8 flux d'échantillons. Ceux-ci pourraient alors être utilisés dans un autre processus ou écrits dans un fichier binaire. – HazyBlueDot