1

UNIX アーカイブ ファイルの内容を読み取ることができる C プログラムに取り組んでいます。たぶん理解できない興味深いバグがあるので、ここで質問しようと思いました。

アーカイブ c.txt のファイル サイズが 1 つずれているようです。おそらく二重リターンのためです。以下は、nano で開いたときのアーカイブ ファイルの内容です。

!<arch>
b.txt           1359332639  502   20    100644  28        `
Appending B. shortb long b

c.txt           1359332646  502   20    100644  17        `
COpy this shit.


d.txt           1359332655  502   20    100644  28        `
Appending D. shortb long b

ファイルサイズは 17 と表示されていますが、d.txt の前の \n しか表示されません。その結果、ファイル サイズで fseek を使用してファイルのリストをスキャンすると、d.txt でクラッシュすることになります。

以下は C の -t のコードです。これはクラッシュしませんが、d.txt の file_name は \nd.txt になります。

詳細バージョンを作成しようとすると、このバグで本当に行き詰まります。

ファイルの処理に何か問題があるのか​​ 、それとも私が得ていない別のニュアンスがあるのか​​ 疑問に思っています。

void table(char *archive){
    printf("\nI'm in -t!\n");
    size_t readNum;
    long long arch_size, file_size;
    char header[60];
    FILE *fp = fopen(archive, "r");
    if (!fp)
        fail('f');

    //get file size
    fseek(fp, 0, SEEK_END);
    arch_size = ftell(fp);
    rewind(fp);

    //move over ARMAG
    if(fseek(fp, strlen(ARMAG), SEEK_SET) != 0)
        fail ('z');

    //loop over files
    while(ftell(fp) < arch_size -1){
        //reads header into
        readNum = fread(header, 1, sizeof(header), fp);
        if(readNum != sizeof(header))
            fail('r');

        printf("%.*s\n", 16, header);

        file_size = atoll(&header[48]);

        //move over file
        if(fseek(fp, file_size, SEEK_CUR) != 0)
            fail ('z');

    }
    fclose(fp);
}
4

0 に答える 0