如果您使用的是文件流而不是文件描述符,那么您可以自己编写一个类似于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()约定之间的合理折衷.
What would the syntax of the function call look like? For example, reading from the offset 732 and then again from offset 432 (both being from start of the file) and filestream called 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()组合不提供的保证原子性.但这在实践中很少会成为问题,除非您在尝试定位和读取文件时有多个进程或线程同时更新文件.