【问题标题】:Binary/Int File reading & Array StorageBinary/Int 文件读取和数组存储
【发布时间】:2012-09-22 16:00:30
【问题描述】:

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

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

对此有什么想法吗?

【问题讨论】:

  • 稍微了解一下文件格式的细节,请您提供一个更好的输入数据示例。值分隔,是全 32 位提供的所有 int 值,或者它们的长度是由空格分隔的任意长度,等等。

标签: c++ arrays file-io binary


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    嗯,你已经把它分解成几个步骤了:

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

    【讨论】:

      【解决方案3】:

      这是一个 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();
      
      }
      

      【讨论】:

      • 文件中的整数是文本。即读取第一个字节及其 0x31('1' 的 ascii 字节)。二进制读/写不是他要处理的。
      猜你喜欢
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      相关资源
      最近更新 更多