我试图解析Linux ar文件的标头。我使用ar.h文件中的ar_hdr结构来保存标题数据。通过使用一个简单的文本文件解析存档并将头数据分配给struct char数组,我开始变得很小。
void conciseTable(char *path)
{
int fd, r, pos;
struct ar_hdr header[20];
//Open the file
fd = open(path, O_RDONLY);
if (fd == -1){
perror("Error opening file");
exit(-1);
}
// seek to end of ARMAG
pos = lseek(fd, SARMAG, SEEK_SET);
r = read(fd, header[1].ar_name, 16);
r = read(fd, header[1].ar_date, 12);
r = read(fd, header[1].ar_uid, 6);
r = read(fd, header[1].ar_gid, 6);
r = read(fd, header[1].ar_mode, 8);
r = read(fd, header[1].ar_size, 10);
printf("%s\n", header[1].ar_name);
printf("%s\n", header[1].ar_date);
printf("%s\n", header[1].ar_uid);
printf("%s\n", header[1].ar_gid);
printf("%s\n", header[1].ar_mode);
printf("%s\n", header[1].ar_size);
close(fd);
}
ar文件如下所示:
!<arch>
1-s.txt/ 1390594295 50389 13361 100640 41 `
1111111111111111111111111111111111111111
当我运行它时,我得到以下输出:
1-s.txt/ 1390594295 50389 13361 100640 41
1390594295 50389 13361 100640 41
50389 13361 100640 41
13361 100640 41
100640 41
41
看起来阵列互相溢出,我无法弄清楚如何阻止这种情况发生。
如果它有帮助,这里是ar.h手册页的link。
答案 0 :(得分:3)
在使用printf("%s\n", ...)
打印字符串之前,您需要指定终止0字符,或者需要明确指定最大打印长度。即。
printf("%16.16s\n", header[1].ar_name);
printf("%12.12s\n", header[1].ar_date);
printf("%6.6s\n", header[1].ar_uid);
...
在您的情况下发生的事情是第一个printf打印了名称,因为没有0终止字符,它继续打印日期,uid等。然后第二个printf打印日期和继续打印uid,... < / p>
答案 1 :(得分:0)
只需读取数据并解析即可。您需要检查然后再次检查。我甚至可以成为这个HTML页面。当你确定适合结构
时