二进制/ Int文件读取&阵列存储

时间:2012-09-22 04:52:31

标签: c++ arrays file-io binary

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

我有一个文本文件,其中包含以二进制形式排序的整数。 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
}

对此有何想法?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

嗯,你已经把它分解为几步:

  • 一次读取8位数字以制作字节
  • 然后将其存储为int
  • 将这些内容添加到一组int中

太棒了!让我们看看每个。

首先,您需要一次读取一个字符的文件。 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();

}