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如何从文件中读取一个位的主要内容,如果未能解决你的问题,请参考以下文章

从文件中读取 64 位整数字符串

求一个Cstring类数组文件读取代码

C/C++中如何将文件读取为二进制数据到数组中,再从数组中读取二进制流还原为文件,主要是后一步

求JS如何读取PHP里的多维数组?

用 C 语言从二进制文件中读取位

c#语言中,如何读取SHP文件?