Самый эффективный способ разделить массив для записи в разные файлы

Я читаю 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);

Добавьте определение read_buf. Это double read_buf[2000];?

i486 21.02.2023 13:04

В сторону: как насчет решения, которое сначала работает правильно? Тогда можно побеспокоиться об эффективности.

Haris 21.02.2023 13:04

@ i486 добавлено определение

DrBwts 21.02.2023 13:31
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
3
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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 должен быть установлен, чтобы указать ошибка.

Другие вопросы по теме