5

免責事項: これは割り当て用です。私は明示的なコードを求めていません。むしろ、自分の問題を理解し、自分で修正できるように、十分な助けを求めるだけです。

ar宿題に従ってUnix ユーティリティを再作成しようとしています。この割り当ての大部分は C のファイル IO を扱い、他の部分はシステム コールなどを扱います。

この例では、アーカイブ内のすべてのファイルの簡単なリストを作成するつもりです。お気づきかもしれませんが、私は遠くまで行っていません。計画は比較的単純です: アーカイブ ファイルから各ファイル ヘッダーを読み取り、 に保持されている値のみを出力しますar_hdr.ar_name。ファイルデータを含む残りのフィールドは、別のファイルに到達するまでスキップされfseek()、その時点でプロセスが再び開始されます。EOF に達すると、関数は単純に終了します。

私はファイル IO の経験がほとんどないため、この割り当てではすでに不利な立場にあります。私は自分の目標を達成するための適切な方法を研究するために最善を尽くしました。そして、自分の能力を最大限に発揮してそれらを実行したと信じています. とはいえ、私の実装には何か問題があるようです。アーカイブ ファイルからのデータは読み取られていないようで、少なくとも変数として保存されているようには見えません。これが私のコードです:

struct ar_hdr
{
    char ar_name[16];   /* name */
    char ar_date[12];   /* modification time */
    char ar_uid[6];     /* user id */
    char ar_gid[6];     /* group id */
    char ar_mode[8];    /* octal file permissions */
    char ar_size[10];   /* size in bytes */
};

void table()
{
    FILE *stream;
    char str[sizeof(struct ar_hdr)];
    struct ar_hdr temp;

    stream = fopen("archive.txt", "r");
    if (stream == 0)
    {
        perror("error");
        exit(0);
    }

    while (fgets(str, sizeof(str), stream) != NULL)
    {
        fscanf(stream, "%[^\t]", temp.ar_name);
        printf("%s\n", temp.ar_name);
    }
    if (feof(stream))
    {
        // hit end of file
        printf("End of file reached\n");
    }
    else
    {
        // other error interrupted the read
        printf("Error: feed interrupted unexpectedly\n");
    }

    fclose(stream);
}

この時点で、データを正しく読み取れるようにしたいだけです。それが終わったら次のファイルを探す作業をします。ただし、明示的なコードを要求しているわけではないことを繰り返したいと思います。このことを学ぶ必要があり、誰かに動作するコードを提供してもらうことはできません。

4

1 に答える 1

3

charデータを保持するためにという名前のバッファを定義しましたが、という名前strの別のメモリar_hdr構造からアクセスしていますtemp。同様に、nullが埋め込まれているために壊れてしまう文字列としてバイナリデータを読み取っています。

バイナリデータとして読み取る必要があり、次のようなものを使用してtempポインタになるように変更するかstr、直接読み取る必要があります。temp

ret=fread(&temp,sizeof(temp),1,stream);

(ドコのfreadを見てください-私のCは錆びすぎて、それを確認できません)。必ず戻り値を確認して使用してください。

于 2013-02-04T20:18:09.030 に答える