【问题标题】:how to print only the file name如何只打印文件名
【发布时间】:2011-12-18 01:11:44
【问题描述】:

我正在阅读存档文件。在 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);

任何帮助将不胜感激。

【问题讨论】:

  • 存档中有correct.c/hello.c/等内容吗?还是它们是程序打开的实际文件?我以前从未遇到过ar 或这些类型的档案。
  • 你好,存档的内容

标签: c string file fopen fgets


【解决方案1】:

如您所见,存档以“!”开头(后跟换行符)。

之后,你的结构大致如下:

#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];
};

存档中的每个文件都有一个,因此如果您只想转储文件名,您可以(至少在理论上——继续阅读)跳过标题,然后通读这些文件并显示文件名。

这确实有一个问题:如您所见,每个文件名只允许 16 个字节,这通常是不够的。有多种处理方式,而且(不幸的是)它们从ar 的一种实现到下一种不同,因此几乎不可能告诉您如何获取真实的文件名。

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

【讨论】:

  • 嗨,Jeff,我还在学习 C,所以几乎所有东西对我来说还是很新的。当我使用 fgets 时,它在行中读取正确吗?一切都落入那个结构吗?或者我将如何使用这个结构?因为我也想以一种详细的方式列出文件。我希望我是有道理的,我已经编写了 10 个小时的代码,哈哈。
  • 很抱歉这个错误的名字。我是说杰瑞。非常抱歉。
  • @inoobdotcom:当你想将数据读入结构体时,通常使用fread,如fread(&amp;mystruct, sizeof(struct), 1, my_file);
猜你喜欢
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多