用C读/写文件

时间:2012-10-18 21:49:17

标签: c ar

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

!<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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

获取包含每个文件大小,其名称及其在文件中的位置的标头信息。

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

http://en.wikipedia.org/wiki/Ar_(Unix)#File_header&lt; - 档案馆的标题。

实施例: @ programmer93考虑你的标题是80字节长(标题包含存档文件的元数据)。您有两个文件,一个是112个字节,另一个是182个字节。现在它们被放置在一个平面文件(存档文件)中。所以它将是80(标题).112(file1.txt).182(file2.txt).EOF。因此,如果您知道每个文件的大小,则可以轻松地(使用fseek())导航到特定文件并仅提取该文件。 [提取file2.txt我只会fseek(FILE*,(112+80),SEEK_SET);然后fgetc()182次。我想我清楚了吗?

答案 1 :(得分:1)

如果无法通过添加其他标题信息来更改文件的格式,那么您将不得不搜索它并随时解决问题。

这不应该太难。只需读取文件,然后读取标题行,例如

file1.txt/      1350248044  45503 13036 100660  28        `

您可以检查文件名和大小等。(您知道在!<arch>之后开头会有一个标题行)。如果这是您想要的文件,stdio.h中的ftell()函数将告诉您文件的确切位置。由于文件大小以字节为单位在标题行中给出,因此您可以通过以正常方式读取前面的特定字节数来读取文件。同样,如果它不是您想要的文件,您可以使用fseek()向前移动正在跳过的文件中的字节数,并准备读取下一个文件的标题信息并重复该过程。