use*_*631 7 c binary fseek fread
我想知道这是否是解决问题的最佳方法.
我知道二进制文件的特定偏移的值,其中我想要的信息被保持...我想要做的是跳转到偏移然后从该位置开始读取一定量的字节.
在使用谷歌之后,我得出结论,我最好的选择是使用fseek()移动到偏移的位置,然后使用fread()从该位置读取一定量的字节.
我在想这个是正确的吗?如果是这样,最好怎么做呢?即如何将两者结合在一起.
如果我不对,你会建议我做什么呢?
非常感谢您的帮助.
马特
编辑:
我遵循了关于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;
}`
Run Code Online (Sandbox Code Playgroud)
所以我使用文件'comm_array2.img'并从文件中读取前10个字符.
但据我所知,这是从文件开始,我想从文件中的某个位置(偏移)
这更有意义吗?
编辑2:
看起来我有点昏暗,所有需要的东西(从我的尝试看起来似乎)是将fseek()放在我在上面的代码中的fread()之前,它寻求到那个位置和然后从那里读.
如果您使用文件流而不是文件描述符,那么您可以自己编写一个类似于 POSIXpread()系统调用的(简单)函数。
您可以使用流而不是文件描述符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);
}
Run Code Online (Sandbox Code Playgroud)
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...
Run Code Online (Sandbox Code Playgroud)
返回计数是每个 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...
Run Code Online (Sandbox Code Playgroud)
每次读取 100 个单字节;该测试可确保您如预期般获得全部 100 个答案。如果您捕获第二个示例中的返回值,您就可以知道您获得了多少数据。如果第一次读取成功而第二次读取失败,那将是非常令人惊讶的;其他一些程序(或线程)必须在两次调用之间截断文件fpread(),但已知会发生更有趣的事情。
1仿真不会完美;该调用提供了和pread()的组合所无法提供的有保证的原子性。但这在实践中很少会成为问题,除非您在尝试定位和读取文件时有多个进程或线程同时更新文件。fseek()fread()