二进制文件路径 c 语言,转到C中的二进制文件的某个点(使用fseek),然后从该位置读取(使用fread)...

如果您使用的是文件流而不是文件描述符,那么您可以自己编写一个类似于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()组合不提供的保证原子性.但这在实践中很少会成为问题,除非您在尝试定位和读取文件时有多个进程或线程同时更新文件.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值