Вот краткий пример того, как я бы записал массив данных в двоичный файл и как я мог бы его прочитать.
Я не понимаю концепции или цели lines
в вашем коде поэтому я не пытался повторить это. Если у вас есть дополнительные данные, которые вам нужно записать, чтобы их можно было восстановить при чтении, я разместил комментарии, чтобы отметить, куда можно вставить этот код.
Имейте в виду, что данные при записи в двоичном виде должны читаться таким же образом, так что если вы писали текст в определенном формате, чтобы использовать его из другой программы, то двоичный файл не будет работать для вас, если вы не измените эту другую программу или не создадите дополнительный шаг для чтения двоичных данных и записи текста форматирование до потребления.
Предполагая, что есть преимущество в скорости записи данных в двоичном формате, тогда добавление дополнительного шага для преобразования двоичных данных в текстовый формат выгодно, потому что вы можете делать это в автономном режиме, когда вы не пытаетесь поддерживать определенную частоту кадров.
Обычно, поскольку вы пометили это c++
, я бы предпочел манипулировать данными в векторе и, возможно, использовать потоки c ++ для записи и чтения данных, но я пытался сохранить это как похожее на Ваш код максимально возможен.
#include <cstdio>
#include <stdint.h>
const size_t kNumEntries = 128 * 1024;
void writeData(const char *filename, int16_t *data, size_t numEntries)
{
FILE *f = fopen(filename, "wb");
if (!f)
{
fprintf(stderr, "Error opening file: '%s'\n", filename);
return;
}
//If you have additional data that must be in the file write it here
//either as individual items that are mirrored in the reader,
//or using the pattern showm below for variable sized data.
//Write the number of entries we have to write to the file so the reader
//will know how much memory to allocate how many to read.
fwrite(&numEntries, sizeof(numEntries), 1, f);
//Write the actual data
fwrite(data, sizeof(*data), numEntries, f);
fclose(f);
}
int16_t* readData(const char *filename)
{
FILE *f = fopen(filename, "rb");
if (!f)
{
fprintf(stderr, "Error opening file: '%s'\n", filename);
return 0;
}
//If you have additional data to read, do it here.
//This code whould mirror the writing function.
//Read the number of entries in the file.
size_t numEntries;
fread(&numEntries, sizeof(numEntries), 1, f);
//Allocate memory for the entreis and read them into it.
int16_t *data = new int16_t[sizeof(int16_t) * numEntries];
fread(data, sizeof(*data), numEntries, f);
fclose(f);
return data;
}
int main()
{
int16_t *dataToWrite = new int16_t[sizeof(int16_t) * kNumEntries];
int16_t *dataRead = new int16_t[sizeof(int16_t) * kNumEntries];
for (int i = 0; i < kNumEntries; ++i)
{
dataToWrite[i] = i;
dataRead[i] = 0;
}
writeData("test.bin", dataToWrite, kNumEntries);
dataRead = readData("test.bin");
for (int i = 0; i < kNumEntries; ++i)
{
if (dataToWrite[i] != dataRead[i])
{
fprintf(stderr,
"Data mismatch at entry %d, : dataToWrite = %d, dataRead = %d\n",
i, dataToWrite[i], dataRead[i]);
}
}
delete[] dataRead;
return 0;
}