C语言中的文件读写

7

我正在用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 / 标题之前停止。


这里使用的存档格式不清楚。那是存档文件的显示吗?或者它是来自另一个工具的显示? - wallyk
是时候选择一个答案了,先生? - Aniket Inge
归档文件就是我发布的内容。这是设计上的意图,我需要想办法从中获取信息。 - Arian Motamedi
2个回答

3

我的解决问题的方法是:

有一个包含每个文件大小、名称和位置的头信息。

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

http://en.wikipedia.org/wiki/Ar_(Unix)#File_header <- ar 存档的头部。

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


我在存档文件中有文件的大小和名称,而且它们的顺序与常规的ar文件完全相同,但是没有位置信息。我不太明白如何通过获取文件的字节来帮助解决这个问题。 - Arian Motamedi
我需要确保自己理解 fseek()、ftell() 和 fgetc() 函数的工作原理。我以前从未使用过它们。 - Arian Motamedi
@programmer93 我觉得举个例子会更加清楚明白。让我写一些代码,向你展示我所说的内容。 - Aniket Inge
我现在更加困惑了。我们忘掉整个归档的事情吧。比如说,我有一个流“Hello, this is a test stream”,我需要找到单词“text”的位置/索引。在这种情况下,它从第18个开始,到第22个结束。最好的方法是什么? - Arian Motamedi
strpos()用于在一堆数据中查找特定的字符串。@programmer93 - Aniket Inge
显示剩余6条评论

1
如果文件格式无法通过添加额外的头信息来更改,则必须搜索文件并在处理过程中解决问题。
这应该不难。只需阅读文件,当您读取标题行时,例如:
file1.txt/      1350248044  45503 13036 100660  28        `

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接