在C中读/写文件
我正在用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)如何获得档案文件中文件名的索引/位置? 请注意,重复的文件名是不允许的,所以我不必担心有两个不同的indecies。
2)在阅读文件时如何跳过几个字符(本例中为58)?
3)如何确定文件内容何时结束? 即我需要它来读取内容并在file2.txt/
header之前停止。
我解决这个问题的方法是:
要获得包含每个文件大小的标题信息,其名称及其在文件中的位置。
然后解析头文件,使用fseek() and ftell()
以及fgetc()
或fread()
函数来获取文件的字节,然后创建并向其写入数据。 这是我能想到的最简单的方法。
http://en.wikipedia.org/wiki/Ar_(Unix)#File_header < - 存档的标题。
示例:@ programmer93考虑您的头文件长度为80个字节(头文件包含归档文件的元数据)。 你有两个文件,一个是112个字节,另一个是182个字节。 现在他们被放置在一个平面文件(存档文件)中。 所以它会是80(标题).112(file1.txt).182(file2.txt).EOF。 因此,如果您知道每个文件的大小,您可以轻松导航(使用fseek())到特定文件并仅提取该文件。 [提取file2.txt我只会fseek(FILE*,(112+80),SEEK_SET);
然后fgetc()182次。 我想我明白了吗?
如果通过添加额外的标题信息来帮助修改文件的格式,那么您需要通过搜索来完成这些工作。
这不应该太难。 只需阅读文件,并在阅读标题行时阅读
file1.txt/ 1350248044 45503 13036 100660 28 `
你可以检查文件名和大小等(你知道你会在!<arch>
之后的头部有一个标题行)。 如果这是你想要的文件,stdio.h中的ftell()
函数会告诉你文件中的确切位置。 由于在标题行中给出了以字节为单位的文件大小,因此可以通过以正常方式读取前面指定的字节数来读取文件。 同样,如果它不是你想要的文件,你可以使用fseek()
来跳转你正在跳过的文件中的字节数,并准备好读取下一个文件的标题信息并重复该过程。