我知道下面的函数:
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
它只能逐字节读取,我的目标是能够每次读取12位,然后将它们存入数组中。非常感谢任何帮助或指点!
除了第一个评论中提到的方法外,您还可以尝试每次读取一个字节(声明一个char变量并写入其中),然后使用位运算符 >> 和 << 逐位读取。在此处阅读更多信息:http://www.cprogramming.com/tutorial/bitwise_operators.html
a_file
文件指针中读取前两个字节,并检查最小或最大字节中的位,使用位移运算符。不能将位放入数组中,因为没有位数据类型。与其在数组中保留1和0,这样效率低下,不如将两个字节保存在双元素数组(例如,类型为unsigned char *
)中,并编写函数将这两个字节映射到4096(2^12)个感兴趣的值之一。作为一个复杂性,在后续读取中,如果要通过指针每12位进行fread
,则只需读取一个字节,使用上次读取剩余的位构建新的12位值。如果没有剩余,需要读取两个字节。您的映射函数需要处理使用了先前读取的位的第二种情况,因为两个字节需要不同的映射。为了高效地执行此操作,可以在读取计数器上使用模数来在两个映射之间交换。读取2个字节并执行位运算将完成下一次读取第2个字节后应用位运算将返回您期望的结果...
针对您的问题,您可以查看此演示程序,它读取2个字节,但实际信息只有12位。此类事情通常使用位访问。
fwrite()是一个标准库函数,它将大小参数作为字节和int类型进行传递。因此,无法精确地读取12位。如果您创建的文件如下所示,则可以解决您的问题。
如果该文件是由其他人编写的特殊文件,则请遵循为该文件提供的标准以进行阅读,我认为他们也会像这样编写。或者您可以提供确切的位置,我可以帮助您。
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data:12;
}NODE;
int main()
{
FILE *fp;
fp=fopen("t","w");
NODE.data=1024;
printf("%d\n",NODE.data);
fwrite(&NODE,sizeof(NODE),1,fp);
NODE.data=0;
NODE.data=2048;
printf("%d\n",(unsigned)NODE.data);
fwrite(&NODE,sizeof(NODE),1,fp);
fclose(fp);
fp=fopen("t","r");
fread(&NODE,sizeof(NODE),1,fp);
printf("%d\n",NODE.data);
fread(&NODE,sizeof(NODE),1,fp);
printf("%d\n",NODE.data);
fclose(fp);
}