如何读取二进制文件并将其保存在管道中

时间:2011-01-09 12:53:53

标签: c io pipe fread

我使用下面的代码打开二进制文件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 个答案:

答案 0 :(得分:1)

将数组写入管道的最明智的方法是,只要尺寸仍然很小,就是这样做:

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

数据的来源无关紧要,只要您实际初始化它。