如何只打印文件名

时间:2011-10-29 23:45:23

标签: c string file fopen fgets

我正在阅读档案文件。在unix中使用ar命令创建的存档文件。当我把文件说出来时

!<arch>
correct.c/      1319871022  1000  1000  100664  0         `
hello.c/        1319871007  1000  1000  100664  0         `
hi.c/           1319870999  1000  1000  100664  0         `
make.c/         1319871028  1000  1000  100664  0         `
pie.c/          1319871015  1000  1000  100664  0         `
three.c/        1319871035  1000  1000  100664  0         `

我想要展示的只是

correct.c
hello.c
hi.c
make.c
pie.c
three.c

以下是有关此部分的代码。 archive_name是文件名。 filestr是一个字符串,它可以容纳30 chars而文件是FILE *file,但它在上面声明。

file = fopen(archive_name, "r");
if(file == NULL) perror("\nError opening file\n");
else {
    while( fgets(filestr, 10, file) != NULL )
        printf("%s", filestr);

fclose(file);

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

正如您所见,存档以“!”开头(接着是新线)。

之后,你有一个大致相同的结构:

#pragma pack(1) // use whatever your compiler wants to ensure against padding.
struct file_header { 
    char filename[16];
    char timestamp[11];
    char ownerID[5];
    char groupID[5];
    char filemode[8];
    char filesize[9];
    char magic[2];
};

存档中的每个文件都有一个,所以如果你想只转储文件名,你可以(至少在理论上 - 继续阅读)跳过标题,然后读取这些并显示文件名。 / p>

但确实存在一个问题:正如您所看到的,每个文件名只允许16个字节,这通常是不够的。有各种各样的处理方式,并且(不幸的是)它们从ar的一个实现变化到下一个,所以几乎不可能告诉你如何获得真实的文件名。

最明显的解决方案可能是使用popen来运行ar(并希望它与您需要查看的存档文件的格式相匹配)。