我想知道这是否是解决问题的最佳方法。
我知道二进制文件的特定偏移的值,其中保存了我想要的信息...我想要做的是跳转到偏移然后从该位置开始读取一定量的字节。
使用谷歌后,我得出结论,我最好的办法是使用fseek()移动到偏移位置,然后使用fread()从该位置读取一定数量的字节。 / p>
我认为这是正确的吗?如果是这样,最好怎么做呢?即如何将两者结合在一起。
如果我不对,你建议我做什么呢?
非常感谢您的帮助。
马特
修改:
我遵循了关于fread()的教程并将其调整为以下内容:
`#include <stdio.h>
int main()
{
FILE *f;
char buffer[11];
if (f = fopen("comm_array2.img", "rt"))
{
fread(buffer, 1, 10, f);
buffer[10] = 0;
fclose(f);
printf("first 10 characters of the file:\n%s\n", buffer);
}
return 0;
}`
所以我使用文件'comm_array2.img'并从文件中读取前10个字符。
但据我所知,这是从文件开始,我想从文件中的某个位置(偏移)
这是否更有意义?
编辑编号2:
看起来我有点昏暗,所有需要的东西(从我的尝试看起来似乎)是将fseek()放在我在上面的代码中的fread()之前,它试图该位置,然后从那里读取。
答案 0 :(得分:2)
如果您使用的是文件流而不是文件描述符,那么您可以自己编写一个类似于POSIX pread()
系统调用的(简单)函数。
您可以使用流而不是文件描述符 1 轻松模拟它。也许你应该自己编写一个这样的函数(它与我在评论中建议的界面略有不同):
size_t fpread(void *buffer, size_t size, size_t mitems, size_t offset, FILE *fp)
{
if (fseek(fp, offset, SEEK_SET) != 0)
return 0;
return fread(buffer, size, nitems, fp);
}
这是pread()
和fread()
惯例之间的合理折衷。
函数调用的语法是什么样的?例如,从偏移量732读取,然后再从偏移量432读取(均来自文件的开头)和称为
f
的文件流。
由于你没有说要读取多少字节,我每次都会假设100。我假设目标变量(缓冲区)是buffer1
和buffer2
,并且它们都足够大。
if (fpread(buffer1, 100, 1, 732, f) != 1)
...error reading at offset 732...
if (fpread(buffer2, 100, 1, 432, f) != 1)
...error reading at offset 432...
返回计数是每个100字节的完整单位数;要么是1(得到了所有东西),要么是0(有些东西出了问题)。
还有其他编写代码的方法:
if (fpread(buffer1, sizeof(char), 100, 732, f) != 100)
...error reading at offset 732...
if (fpread(buffer2, sizeof(char), 100, 432, f) != 100)
...error reading at offset 432...
每次读取100个单字节;测试确保您按预期获得所有100个。如果您在第二个示例中捕获返回值,则可以知道您获得了多少数据。如果第一次读取成功而第二次读取失败,那将是非常令人惊讶的;其他一些程序(或线程)必须在对fpread()
的两次调用之间截断文件,但已知有趣的事情发生。
1 仿真效果不佳; pread()
调用提供了fseek()
和fread()
的组合无法提供的保证原子性。但这在实践中很少会成为问题,除非您在尝试定位和读取文件时有多个进程或线程同时更新文件。
答案 1 :(得分:1)
它通常取决于您关心的部件之间的距离。如果您只是在您关注的部分之间跳过/忽略几个字节,那么通常更容易阅读该数据并忽略您阅读的内容,而不是使用fseek
跳过它。一种典型的方法是定义一个结构,同时包含您关心的数据,以及您不关心的数据的占位符,在结构中读取,然后只使用您关注的部分:
struct whatever {
long a;
long ignore;
short b;
} w;
fread(&w, 1, sizeof(w), some_file);
// use 'w.a' and 'w.b' here.
如果您关心的部分之间有任何距离,那么您最初使用fseek
来获取重要部分的想法可能会更简单。
答案 2 :(得分:0)
你的理论听起来很正确。打开,寻找,阅读,关闭。
为要读取的数据创建一个结构,并将指针传递给struct的已分配内存的read()。您可能需要在结构上使用#pragma pack(1)或类似内容来防止错位问题。