Я читаю double данные из DAQ, который имеет 2 канала. Данные хранятся в read_buf, первые 1000 образцы — это channel 0, а вторые 1000 — это channel 1. У меня нет контроля над этой конкатенацией данных канала.
Я создал 2 таких файла,
FILE *fptr_0;
if ((fptr_0 = fopen("channel_0.bin", "wb")) == NULL)
{
printf("Error opening file.\n");
exit(1);
}
FILE *fptr_1;
if ((fptr_1 = fopen("channel_1.bin", "wb")) == NULL)
{
printf("Error opening file.\n");
exit(1);
}
Затем я хотел бы разделить read_buf и отправить первую половину fptr_0, а вторую — fptr_1. Я могу прочитать первую половину, но не могу понять, как прочитать вторую половину. Как указать fptr_1 только на вторую половину read_buf?
Нужно ли копировать каждую половину в новый массив?
То, что у меня есть на данный момент, что работает в первой половине, а затем то, что я не получаю,
double read_buf[2000];
result = DAQ_func(device, &status, read_buf);
fwrite(&read_buf, sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_0);
fwrite( ??? , sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_1);
В сторону: как насчет решения, которое сначала работает правильно? Тогда можно побеспокоиться об эффективности.
@ i486 добавлено определение
fwrite(read_buf + 1000, sizeof (double), (sizeof read_buf / sizeof read_buf[0]) / 2, fptr_1);
Как мне указать fptr_1 только на вторую половину read_buf?
Вы не хотите указывать FILE * ни на что, кроме потока, связанного с файлом.
fwrite( ??? , sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_1);
Добавление 1000 к read_buf увеличит его на размер его содержимого.
Итак, это дает нам:
fwrite (read_buf + 1000, sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_1);
Или:
fwrite (&read_buf[1000], sizeof(double), (sizeof(read_buf) / sizeof(read_buf[0])) / 2, fptr_1);
Это самый эффективный способ? Возможно, нет, но это правильно.
Также следует проверить возвращаемое значение fwrite():
Функция fwrite() должна возвращать количество элементов успешно записано, что может быть меньше, чем items, если запись встречается ошибка. Если size или items равны 0, fwrite() должен возвращает 0, и состояние потока остается неизменным. В противном случае, если произойдет ошибка записи, индикатор ошибки для поток должен быть установлен, и errno должен быть установлен, чтобы указать ошибка.
Добавьте определение read_buf. Это double read_buf[2000];?