用C读/写文件

Ari*_*edi 7 c unix-ar

我正在用C编写一个程序,基本上为给定的文件名列表创建一个存档文件.这与arlinux中的命令非常相似.这是存档文件的样子:

!<arch>
file1.txt/      1350248044  45503 13036 100660  28        `
hello
this is sample file 1
file2.txt/      1350512270  45503 13036 100660  72        `
hello
this is sample file 2
this file is a little larger than file1.txt
Run Code Online (Sandbox Code Playgroud)

但是我在尝试从存档中提取文件时遇到了困难.假设用户想要提取file1.txt.我们的想法是它应该获取文件名的索引/位置(在本例中为file1.txt),跳过58个字符以获取文件内容,读取内容并将其写入新文件.所以这是我的问题:

1)如何在归档文件中获取文件名的索引/位置?请注意,不允许使用重复的文件名,因此我不必担心有两个不同的内容.

2)如何在阅读文件时跳过多个字符(在本例中为58)?

3)如何判断文件内容何时结束?即我需要它来阅读内容并在file2.txt/标题前停止.

Ani*_*nge 3

我解决这个问题的方法是:

拥有包含每个文件的大小、文件名及其在文件中的位置的标头信息。

然后解析标头,使用fseek() and ftell()以及fgetc()fread()函数来获取文件的字节,然后创建+写入该数据。这是我能想到的最简单的方法。

http://en.wikipedia.org/wiki/Ar_(Unix)#File_header <- ar 档案的标题。

示例:@programmer93 假设您的标头长度为 80 字节(标头包含存档文件的元数据)。您有两个文件,一个为 112 字节,另一个为 182 字节。现在它们被放置在一个平面文件(存档文件)中。所以它将是 80(header).112(file1.txt).182(file2.txt).EOF 。因此,如果您知道每个文件的大小,则可以轻松导航(使用 fseek())到特定文件并仅提取该文件。[要提取 file2.txt,我只需fseek(FILE*,(112+80),SEEK_SET);执行 fgetc() 182 次。我想我已经说清楚了?