0

友人を助けようとしていますが、コードを求めているわけではありません。

バイナリ形式でソートされた整数を含むテキスト ファイルがあります。100010101001010101010. 一度に 8 つの int を読み取って 1 バイトを作成し、それを int として保存し、それを int の配列に入れるにはどうすればよいでしょうか。文字列など、動的割り当てを使用するものは使用できません。数字は 1 行に表示されます。私はプログラムを通してそれらを自分で分離する必要があります。

各 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
}

これについて何か考えはありますか?

4

3 に答える 3

2

ループを使用すると、すべての反復で、すべての数字を処理できます。2^71 桁目を 2 桁目を掛けて、それを自分の桁2^6まで続けます(掛ける)。また、これを実行しながら、この数値を追加して、ベクトルまたは配列に格納します。また、数字の現在の位置を追跡する変数があります。数字ごとに、上記と同じプロセスを実行して を に変換する必要があるためです。8th2^088 bit binarybyte

于 2012-09-22T05:08:32.640 に答える
1

以下は、整数をバイナリ形式でファイルに書き出す方法と、同じプログラムでバイナリ データを整数として読み取る方法の C++ の例です。コメントはプログラムにあります。これが役立つことを願っています。

charこれは、マシンがデータ型を 1 バイトおよびint4 バイトとして認識していることを前提としています。

#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として保存します
  • それをintの配列に詰め込みます

それは素晴らしいことです!それぞれ見てみましょう。

まず、一度に 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 を 2 進数に組み立てるにはどうすればよいでしょうか。答えはビットシフトです。出力番号を保持する変数を設定し、最下位ビットを繰り返し設定して、他のビットを上にシフトします。そう:

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 に答える