gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:06 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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]); 而终止您的进程。

一次写入一个字节是可能的 - 它的性能不是很好。

在您已经将数据读入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];
}

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

关于c - 如何读取二进制文件并将其保存在管道中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4639192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com