0

试图帮助朋友,我不是要代码。

我有一个文本文件,其中包含以二进制形式排序的整数。100010101001010101010。我将如何一次读取 8 个整数来生成一个字节,然后将其存储为整数,然后将其填充到整数数组中。我不能使用字符串或任何具有动态分配的东西。数字在一行上。我必须自己通过程序将它们分开。

我考虑过使用一个带有指针的 for 循环来读取每个 int 并将它们附加到一个 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
}

对此有什么想法吗?

4

3 回答 3

2

您可以使用循环,并且在每次迭代中,您将遍历每个数字。将第一个数字乘以2^7第二个数字,2^6然后继续直到您的8th数字(乘以2^0)。此外,在进行此操作时,添加此数字并存储在向量或数组中。另外,有一个变量来跟踪数字的当前位置。因为,在每个8数字之后,您必须执行上述相同的过程才能8 bit binarybyte.

于 2012-09-22T05:08:32.640 回答
1

Here is a C++ example of how to write integers in binary form out to a file, and how to read the binary data back as integers in the same program. Comments are in the program, hopefully this helps.

This assumes your machine acknowledges data type char as 1 byte, and int as 4 bytes.

#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();

}
于 2012-09-22T05:45:30.183 回答
1

好吧,您已经将其分解为以下步骤:

  • 一次读取 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数组的循环中。这只是记住您已经存储了多少数字(一个计数器),然后在您到达文件末尾时从循环中转义的问题。

于 2012-09-22T05:11:13.760 回答