对设备的读取和写入都必须是扇区对齐的,并且字节数必须是扇区大小的整数倍。
不要对扇区大小做出假设,您应该查询任何设备的扇区大小,并动态处理它。硬盘驱动器的典型尺寸为 512,光驱为 2048。
如果您想要允许您在设备上逐字节读取的功能,而不会产生浪费的开销,请尝试以下技巧:
FILE *file_pointer = fopen("/path/to/device", "rb");
size_t sector_size;
ioctl(fd, BLKSSZGET, §or_size);
setvbuf(file_pointer, NULL, _IOFBF, sector_size);
如果您需要在 Windows 上获取扇区大小,可以DeviceIoControl()
使用IOCTL_DISK_GET_DRIVE_GEOMETRY
.
Stdio 将对齐查找s
并读取 size 块s
。posix_memalign()
此外,您可以使用或提供您自己的缓冲区_aligned_malloc()
,如果您的基础 stdio 实现不这样做。
编辑:清除评论中的一些混淆
您正在使用扇区大小为 512 的设备,使用FILE *f;
. 您fseek()
偏移 37.f
的位置已更新,但未在设备上进行搜索。你fread()
500字节。lseek()
以 0 的偏移量调用。将 512 个字节读入f
的缓冲区。字节 37 到 512 被复制到您提供的缓冲区。lseek()
以 512 的偏移量调用。读取 512 个字节,并将您期望的剩余 463 个字节复制到您传递给fread()
. 如果您现在fread()
是单个字节,则只需将其从 中的现有缓冲区中复制出来f
,而不会影响设备。