2011-01-09 114 views
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); 

如果我想做一个数组的总和,我该怎么做呢?

+0

当文件打开失败时,您仍然在调用fread。错误消息后应该返回。 – phihag 2011-01-09 13:02:59

回答

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,在这种情况下你的阅读代码有重大问题),它假定缓冲区的大小在一个管道足够大以容纳数据;如果不是,你的写入调用可能会阻塞,它假定有某个地方有一个进程从pip中读取Ë;如果这是唯一的过程,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]; 
} 

不要紧,当数据从,只是只要你真正初始化它来了。

相关问题