1

我使用下面的代码打开了一个二进制文件fp(该文件包含一个保存的二维数组)并将其放入管道中:

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 );

如果我想对数组求和,我该怎么做?

4

1 回答 1

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 调用可能会阻塞。它假设某处有一个进程可以从管道中读取;如果这是唯一的进程,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];
}

数据来自哪里并不重要,只要您实际初始化它即可。

于 2011-01-09T16:39:59.680 回答