好吧,您已经将其分解为以下步骤:
- 一次读取 8 个数字以生成一个字节
- 然后将其存储为 int
- 把它塞进一个整数数组中
那太棒了!让我们看看每一个。
首先,您需要一次读取一个字符。C 标准库为此提供了一个函数:fgetc
. 传入 a FILE *
,它会返回它读取的数字的 ASCII 值,或者EOF
当你到达文件末尾时返回 (-1)。
所以,我们知道我们可以使用fgetc
,并且没有任何换行符,我们知道它将返回'1'
,'0'
或EOF
。换一种方式:
10001101 => successive fgetc() calls will return
'1', '0', '0', '0', '1', '1,' '0', '1', 'EOF'
这听起来像一个循环:
for (int bits = 0; bits < 8; bits++) {
int digit = fgetc(file);
if (digit == '0') {
// something
} else if (digit == '1') {
// something else
} else if (digit == EOF) {
// done with the file
}
}
好的。现在,我们如何将 0 和 1 组合成二进制数?答案是位移。我们设置一个变量来保存输出数,然后重复设置最低位并将其他位向上移动。所以:
10001101
'1' => 1
'0' => 10
'0' => 100
'0' => 1000
'1' => 10001
'1' => 100011
'0' => 1000110
'1' => 10001101
所以:
int number = 0;
for (int bits = 0; bits < 8; bits++) {
// shift number up one place
number = number << 1;
int digit = fgetc(file);
if (digit == '0') {
// do nothing; the lowest bit is 0 already
} else if (digit == '1') {
// set number's lowest bit
number |= 0x01;
} else if (digit == EOF) {
// done with the file
}
}
现在您需要做的就是将其包装在另一个放入number
数组的循环中。这只是记住您已经存储了多少数字(一个计数器),然后在您到达文件末尾时从循环中转义的问题。