Самый разумный способ записи массива в канал, пока размер остается маленьким, это сделать:
int nw = 5 * 5 * sizeof(int);
if (write(fd[1], array, nw) != nw)
err_exit("Failed to write to pipe");
(где err_exit()
- это функция, которая записывает сообщение в стандартную ошибку и завершает работу (или не возвращает).
Это предполагает, что ваш массив является массивом 5x5 (ваш комментарий подразумевает, что он равен 10x2, и в этом случае ваш код чтения имеет серьезные проблемы). Предполагается, что размер буфера в канале достаточно велик для хранения данных; если это не так, ваш вызов записи может заблокироваться. Предполагается, что есть где-то процесс для чтения из канала; если это единственный процесс, write()
сработает сигнал SIGPIPE, убив ваш процесс, из-за close(fd[0]);
.
Запись по одному байту за раз возможна - это не звездная производительность.
Чтение одного байта за раз из fp
после того, как вы уже прочитали данные в array
, не совсем разумно - в лучшем случае вы читаете разные данные для записи в канал.
Обычный способ суммирования двумерного массива: (C99):
enum { DIM_1 = 5, DIM_2 = 5 };
int array[DIM_1][DIM_2];
...data to load array...
int sum = 0;
for (int i = 0; i < DIM_1; i++)
{
for (int j = 0; j < DIM_2; j++)
sum += array[i][j];
}
Неважно, откуда пришли данные, только если вы на самом деле их инициализировали.