试图帮助朋友,我不是要求代码。
我有一个文本文件,其中包含以二进制形式排序的整数。 100010101001010101010。 我如何一次读取8个整数来创建一个字节,然后将其存储为int,将其存储到一个int数组中。我不能使用字符串,或任何动态分配。这些数字在一条线上。我必须通过该计划自己分开。
我想过使用带有指针读取每个int的for循环并将它们附加到int,将该int抛入数组。有点像(请原谅我的解释编码,我有一段时间没有触及它。)
while(eof) //end of file
{
for(int i = 0, i > 9, i ++)
{
pointer read file seekg()
int += seekg() // minus the part where its mathematically adding im thinking of str+= str
//i know its the wrong code
}
x++
array [x] = int from for loop
}
对此有何想法?
答案 0 :(得分:2)
您可以使用循环,并且在每次迭代中,您将遍历每个数字。将第一个数字乘以2^7
,将第二个数字乘以2^6
,然后直到8th
数字(多个2^0
)。此外,在执行此操作时,请添加此数字并存储在矢量或数组中。此外,还有一个跟踪数字当前位置的变量。因为,在每8
个数字之后,您必须执行相同的上述过程,才能将8 bit binary
转换为byte
。
答案 1 :(得分:1)
嗯,你已经把它分解为几步:
太棒了!让我们看看每个。
首先,您需要一次读取一个字符的文件。 C标准库为此提供了一个函数:fgetc
。传入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
放入数组的循环中。这只是记住你已经存储了多少个数字(一个计数器),然后在你到达文件末尾时从循环中转出。
答案 2 :(得分:1)
这是一个C ++示例,说明如何将二进制形式的整数写入文件,以及如何在同一程序中将二进制数据作为整数读回。评论在程序中,希望这会有所帮助。
这假设您的机器将数据类型char
确认为1个字节,将int
确认为4个字节。
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ofstream outFile; // File which we will write binary data to.
ifstream inFile; // File which we will read binary data from.
outFile.open( "intBin.txt", ios::binary ); // Flag file as binary.
for( int i = 0; i < 20; ++i ) {
// This writes 4 bytes out to file.
outFile.write( reinterpret_cast<const char*>(&i), sizeof(int) );
}
outFile.close(); // Must close, since race conditions will occur accessing same file in same process of our program.
inFile.open("intBin.txt", ios::binary); // Flag file as binary.
int binVals;
for( int i = 0; i < 20; ++i ) {
// This reads 4 bytes back into the file.
inFile.read( reinterpret_cast<char*>(&binVals), sizeof(int) );
cout << binVals << endl;
}
inFile.close();
}