1

以下のコードを使用して、バイナリファイル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 );

配列の合計を作成したい場合、どうすれば作成できますか?

4

1 に答える 1

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()SIGPIPEシグナルをトリガーし、が原因でプロセスを強制終了しますclose(fd[0]);

一度に1バイトを書き込むことは可能です-それはパフォーマンスのために恒星ではありません。

fpすでにデータを読み込んだ後から一度に1バイトを読み取るarrayことは、完全に賢明なことではありません。パイプに書き込むために、せいぜい別のデータを読み取ることになります。

2D配列を合計する通常の方法は、(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];
}

実際にデータを初期化する限り、データがどこから来たかは関係ありません。

于 2011-01-09T16:39:59.680 に答える