Как прочитать бинарный файл и сохранить его в трубе - PullRequest
1 голос
/ 09 января 2011

Я использовал приведенный ниже код, чтобы открыть двоичный файл fp (файл содержит сохраненный 2D-массив) и поместил его в канал:

if ((fp=fopen("file", "rb"))==NULL) {
    printf("Cannot open file.\n");
}
if (fread(array, sizeof(int), 5*5, fp) != 5*5) {
    if (feof(fp))
        printf("Premature end of file.");
} else {
    printf("File read error fread.");
}

Это код для помещения в трубу?

close(fd[0]);
if ((ch=fgetc(fp))==EOF)
    write(fd[1], &ch, 1 );

Если я хочу сделать сумму массива, как я могу это сделать?

1 Ответ

1 голос
/ 09 января 2011

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

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];
}

Неважно, откуда пришли данные, только если вы на самом деле их инициализировали.

...