C如何从文件中读取一个位
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C如何从文件中读取一个位相关的知识,希望对你有一定的参考价值。
我正在C:infile=fopen(input, "rb")
中读取二进制文件,并尝试一次读取每个位,所以如果文件内容是:
“你好”
'h'的ascii值是104
所以在二进制中它将是1101000
。
是否有一个fgetbit()方法可以调用并分配给基本类型? EX:
int my_bit=fgetbit(infile); //value of my_bit would be 1 for hello example.
在文件I / O期间,您不能获得比字节更精细的数据,但如果您真的想在位级工作,则可以使用位掩码或位移来在读取字节后隔离所需的位出文件。
例如,输出/检查字节中的每个位:
#include <limits.h> // for CHAR_BIT
...
unsigned char b = 0xA5; // replace with whatever you've read out of your file
for(i = 0; i < CHAR_BIT; i++)
{
printf("%d", (b>>i)&1);
}
要隔离字节中最重要的位:
unsigned char mask = 0x80; // this value may differ depending on your system's CHAR_BIT
unsigned char value = /* read from file */;
if(value&mask)
{
// MSB is set
}
else
{
// MSB is clear
}
正如大家告诉你的那样,C中没有可用的位访问功能。
更详细地说,磁盘是一个块设备,这意味着只允许读取和写入定义明确的维度的块来访问其内容,由于历史原因,这些块通常大512字节。
那么如何工作函数允许你一次访问单个char
(考虑到C中的char
是最小的数据单元,并且在某些系统上它可以与8位不同,即12或16位)?
C标准库和几乎所有OS文件函数都使用缓冲机制来访问单个char
。系统从磁盘读取一大块数据并从块中传递一个字节,依此类推,直到块的最后一个char
。在char
的下一个用户请求中,该函数从磁盘读取下一个文件块,在内部缓冲它并向用户提供新读取的记录数据的第一个char
。
此过程将继续到达文件末尾。
当以kazxswpoi一次向磁盘写入数据时,执行相同的过程,但是以相反的方式。每个char
都被缓冲,当达到块的大小时,它会在物理磁盘上刷新。
要解决您的问题,您必须编写自己的一组缓冲函数,这些函数将从文件中读取char
,并在每次请求时输出一位。当char
的完整位度被激活时,该函数将读取另一个字符并再次启动。
这是一组这样的函数的小样本:
char
你可以在Binary中读取文件:
#include <stdio.h>
#include <limits.h>
/*
* Bit FILE pointer structure
*/
typedef struct
{
FILE *fp; //Disk file pointer
int ReadChar; //Current char read from stream
int BitCounter; //counter of the current bit
} BITFILE;
/*
* Function to open a file for bit reading
*/
BITFILE *bfopen(const char *filename)
{
FILE *fp = fopen(filename, "rb");
if (!fp) //Error opening file
return NULL;
BITFILE *bf = malloc(sizeof(BITFILE));
if (!bf) //No memory
{
fclose(fp); //Close file
return NULL;
}
bf->fp = fp; //Save File pointer
bf->ReadChar = getc(fp); //Read in first char
bf->BitCounter = 0; //First bit
return bf;
}
/*
* Function to close (release) a bit file
*/
void bfclose(BITFILE *bf)
{
if (!bf) //Bad descriptor
// Do some error signaling
return;
fclose(bf->fp); //Close file
free(bf); //release memory
}
/*
* Function to read a single bit
*/
int fgetbit(BITFILE *bf)
{
if (!bf) //Bad descriptor
// Do some error signaling
return;
if (bf->BitCounter >= CHAR_BIT) //No more bits to read on this machine
{
bf->ReadChar = getc(bf->fp); //Read in another char
bf->BitCounter = 0; //Reset counter
}
if (EOF == bf->ReadChar) //If end of file reached return EOF
return EOF;
//Note that to avoid sign complications in bit working
// we cast the value to unsigned
int bit = ((unsigned)bf->ReadChar) & 1; //Get the LSB that we will return
bf->ReadChar = ((unsigned)bf->ReadChar) >> 1; //Advance bits shifting
bf->BitCounter++; //Update counter
return bit;
}
int main(int argc, char *argv[])
{
BITFILE *bf = bfopen("test.txt");
if (!bf)
{
printf("Error can't open file \"%s\"\n", "test.txt");
return 1;
}
for (int cnt=1; ; cnt++)
{
int bit = fgetbit(bf);
if (EOF == bit)
break;
printf ("%3d) bit %d\n", cnt, bit);
}
bfclose(bf);
return 0;
}
然后,您可以使用以下内容获取单个位:
FILE *fp;
fp = fopen(input, "rb");
以上是关于C如何从文件中读取一个位的主要内容,如果未能解决你的问题,请参考以下文章