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 的文件名是 \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