[英]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.