在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()来跳转你正在跳过的文件中的字节数,并准备好读取下一个文件的标题信息并重复该过程。

链接地址: http://www.djcxy.com/p/64979.html

上一篇: Read/Write files in C

下一篇: Center one <div> and float other right