我一定要FSEEK几次,如果我要访问不同的资料片在一个文件?

问题描述 投票:0回答:2

在文件元数据的固定位置,有三个重要的整数,每个存储的使用正好是4个字节:

在字节偏移10-13中,在像素阵列开始位图文件中的偏移。

在字节偏移18-21,图像的宽度,以像素为单位。

在字节偏移22-25中,图像的高度,以像素为单位。

/*
 * Read in the location of the pixel array, the image width, and the image
 * height in the given bitmap file.
 */
void read_bitmap_metadata(FILE *image, int *pixel_array_offset, int *width, int *height) {

    fseek(image, 10, SEEK_SET);
    fread(pixel_array_offset, 4, 1, image);
    fseek(image, 18, SEEK_SET);
    fread(width, 4, 1, image);
    fseek(image, 22, SEEK_SET);
    fread(height, 4, 1, image);

}

我一定要在这里使用fseek 3次,连注意到,宽度和高度都不断?

c fseek
2个回答
2
投票

不,你可以省略最后fseek()

所述fread()通过数据的读出的量总是前移文件位置。所以,你只需要fseek()当你想跳过一些字节,或当你想寻求一个固定的位置,你不关心您当前所在。

既然你只跳过几个字节,你可能也只是做从偏移0 26字节的单fread()到缓冲区中,然后从缓冲挑选数据,你需要它。

字节序的警告:有是从文件中读取多字节整数当一个大问题:这是否工作或不依赖于文件的字节序和主机字节序。您的代码只有当它们匹配的作品。如果他们不匹配你有fread()手术后交换字节。在Linux上你有bswap_32()这一点,或者如果该文件中的字节顺序是大端(又名网络字节顺序),你可以使用ntohl()


-2
投票

如果您使用的是最新的操作系统(即具有虚拟内存),那么你可以使用mmap,将文件映射到内存中(不复制,它使用的虚拟内存)。这将允许你读/(任选地写),并寻求使用的存储器操作:在C.指针运算/阵列,

对于Unix系统(GNU / Linux的,MacOS的,BSD,系统V),参见https://en.wikipedia.org/wiki/Mmaphttp://man7.org/linux/man-pages/man2/mmap.2.html

我认为,即使微软的Windows现在可以做到这一点,看到https://docs.microsoft.com/en-gb/windows/desktop/Memory/file-mapping

© www.soinside.com 2019 - 2024. All rights reserved.