unix ar命令中的文件大小不匹配

时间:2013-02-02 02:36:15

标签: c fread ar

我正在开发一个可以读取unix存档文件内容的C程序。我有一个有趣的错误,也许我不明白,所以我想我会在这里问。

在我看来,存档c.txt的文件大小是一个。可能是因为双重回报。以下是在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);
}

0 个答案:

没有答案