我在这里发布了同样的问题:
How to print the name of the files inside an archive file?
但这些答案并不一定能解决问题。我有一个归档文件week.a,我想打印出该档案中的文件名称,名为mon.txt和fri.txt。
它应该像ar -t命令一样工作,除非我不允许使用它。
我尝试过的: 我的第一次尝试是创建一个for循环并打印出参数,但后来我意识到该文件已经被归档了,所以这样就不行了。 我的第二次尝试是查看ar的print_contents函数,我在下面列出:
static void
print_contents (bfd *abfd)
{
size_t ncopied = 0;
char *cbuf = (char *) xmalloc (BUFSIZE);
struct stat buf;
size_t size;
if (bfd_stat_arch_elt (abfd, &buf) != 0)
/* xgettext:c-format */
fatal (_("internal stat error on %s"), bfd_get_filename (abfd));
if (verbose)
printf ("\n<%s>\n\n", bfd_get_filename (abfd));
bfd_seek (abfd, (file_ptr) 0, SEEK_SET);
size = buf.st_size;
while (ncopied < size)
{
size_t nread;
size_t tocopy = size - ncopied;
if (tocopy > BUFSIZE)
tocopy = BUFSIZE;
nread = bfd_bread (cbuf, (bfd_size_type) tocopy, abfd);
if (nread != tocopy)
/* xgettext:c-format */
fatal (_("%s is not a valid archive"),
bfd_get_filename (bfd_my_archive (abfd)));
/* fwrite in mingw32 may return int instead of size_t. Cast the
return value to size_t to avoid comparison between signed and
unsigned values. */
if ((size_t) fwrite (cbuf, 1, nread, stdout) != nread)
fatal ("stdout: %s", strerror (errno));
ncopied += tocopy;
}
free (cbuf);
}
但是通过这条路线,我真的不知道很多代码意味着什么或者做什么(我对C来说很新)。有人可以帮助理解这段代码,还是指出我正确的方向来编写我的程序?谢谢。
答案 0 :(得分:2)
根据wikipedia.org/wiki/Ar_(Unix)的格式,您的计划的基本形状将是:
fopen(filename)
fscanf 8 characters/* global header */
check header is "!<arch>" followed by LF
while not at end of file /* check return value of fcanf below */
fscanf each item in file header
print filename /* first 16 characters of file header */
check magic number is 0x60 0x0A
skip file size characters /* file contents - can use fseek with origin = SEEK_CUR */
fclose(file)
有关所需功能的详细信息,请参阅C stdio library documentation 。或者参见Wikipedia C file input/output
答案 1 :(得分:1)
int counting(FILE *f)
{
int count=0;
rewind(f);
struct ar_hdr myheader;
fseek(f,8,SEEK_CUR);
while(fread(&myheader,sizeof(struct ar_hdr),1,f)>0)
{
long test;
test = atol(myheader.ar_size);
fseek(f,test,SEEK_CUR);
count++;
}
printf("count is : %d\n",count);
return count;
}
我编写的这段代码用于计算存档中的文件数量。你可以使用相同的方法打印其中的文件名