繁体   English   中英

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

[英]How to read a binary file and save it inside a pipe

我使用下面的代码打开了一个二进制文件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 );

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

只要大小保持较小,将数组写入管道的最明智的方法是:

int nw = 5 * 5 * sizeof(int);
if (write(fd[1], array, nw) != nw)
    err_exit("Failed to write to pipe");

(其中err_exit()是将消息写入标准错误并退出(或不返回)的函数。)

假设您的数组是5x5数组(您的注释表示它是10x2,在这种情况下,您的阅读代码存在重大问题)。 假定管道中缓冲区的大小足以容纳数据。 如果不是,您的写调用可能会阻塞。 它假定存在从管道读取的过程; 如果这是唯一的进程,则由于close(fd[0]);write()将触发SIGPIPE信号,杀死您的进程close(fd[0]);

一次写入一个字节是可能的-这对于性能而言并不是很出色。

在将数据读入array后,一次从fp读取一个字节并不完全明智-您最好读取不同的数据以写入管道。

求和二维数组的一般方法是(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];
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM