在文件元数据中的固定位置,有三个重要的 整数,每个整数使用正好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次,甚至注意宽度和高度都是连续的?
答案 0 :(得分:2)
否,您可以省略最后一个select split_part('j.smith@email.comc.jones@email.com','.com',1)||'.com';
select split_part('j.smith@email.comc.jones@email.com','.com',2)||'.com';
。
fseek()
始终使文件位置前进读取的数据量。因此,只在需要跳过某些字节或想要定位到固定位置而不必关心当前位置时,才需要fread()
。
由于只跳过了几个字节,所以您也可以将26个字节的偏移量0中的单个fseek()
放入缓冲区中,然后根据需要从缓冲区中选择数据。
字节序警告::从文件中读取多字节整数时存在一个大问题:是否有效取决于文件的字节序和主机的字节序。您的代码仅在它们匹配时才有效。如果它们不匹配,则必须在fread()
操作之后交换字节。在Linux上,您可以使用fread()
,或者如果文件中的字节序为 big endian (又名网络字节序),则可以使用bswap_32()
答案 1 :(得分:-2)
如果使用的是现代操作系统(具有虚拟内存),则可以使用mmap
将文件映射到内存(非复制,它使用虚拟内存)。这将允许您使用内存操作(C语言中的指针算术/数组)读取/(可选地写入)和查找。
对于Unixes(Gnu / Linux,MacOS,BSD,System V),请参见https://en.wikipedia.org/wiki/Mmap和 http://man7.org/linux/man-pages/man2/mmap.2.html
我认为即使Microsoft Windows也可以执行此操作,请参见https://docs.microsoft.com/en-gb/windows/desktop/Memory/file-mapping