不是你的错误的原因(见下文),但很奇怪
struct ar_hdr d; struct ar_hdr* bob = &d; ... bob = malloc(sizeof(struct ar_hdr)); ... fwrite(bob, sizeof(d),1, fp);
我很沮丧,我只是把所有东西放到d里就是这样。
现在,因为你的ar_hdr看起来像这样:
struct ar_hdr /* file member header */ { char ar_name[16]; /* '/' terminated file member name */ char ar_date[12]; /* file member date */ char ar_uid[6] /* file member user identification */ char ar_gid[6] /* file member group identification */ char ar_mode[8] /* file member mode (octal) */ char ar_size[10]; /* file member size */ char ar_fmag[2]; /* header trailer string */ };
维基百科的文章 提到文本标题是最常用的格式:
Offset Length Name Format 0 16 File name ASCII 16 12 File modification timestamp Decimal 28 6 Owner ID Decimal 34 6 Group ID Decimal 40 8 File mode Octal 48 10 File size in bytes Decimal 58 2 File magic 0x60 0x0A
这意味着将结构直接写入文件是 的 不 强> 您需要做什么:由单个sprintf生成的C字符串是空终止的,并且null后面的内容(直到数组的长度)是垃圾。文件格式需要空格字符而不是垃圾,也没有空的....
实际上我认为你的初始fprintf非常接近:
fprintf(fp, "%-16s%-12ld%-6ld%-6ld%-8o%-10lld%c%c", fname, (long)sb.st_mtimespec.tv_sec, (long)sb.st_uid, (long)sb.st_gid, sb.st_mode, (long long)sb.st_size,0x60,0xa);
由于我无法在这里快速测试,可能仍然存在一些小问题,但它应该非常接近。
附录:对于这种工作,一种工具来查看每个字节的文件内容字节(如所有Linux发行版附带的od)和一个按字节比较两个文件的工具(如 dhex )真的是必须的,因为只是测试ar愿意打开的东西太辛苦和耗时。