2011-01-09 169 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]; 
} 

不要緊,當數據從,只是只要你真正初始化它來了。

相關問題