0

メンバーとして大きな配列を含むクラスがあります。

exampleclass{
public:
   ...
   static void set_array();
   static int somearray[1000];
};

(配列は非公開にする必要がありますが、簡単で汚いテストの目的で公開に設定しました。以下を参照してください)

これで、配列は次のように初期化されます。

int exampleclass::somearray[1000];

これは、すべての値が 0 であることを意味します。これまでのところ、すべて問題ありません

ここで、次のように定義された関数でこれを初期化したいと思います。

void exampleclass::set_array()
{
memset(somearray, 0, sizeof(somearray));
FILE* fin= fopen("myfile.dat", "rb");
size_t bytesread= fread(somearray, sizeof(somearray), 1, fin);
fclose(fin);
}

これはすべてヘッダーファイルに含まれています

これを任意のクラスの外で使用すると (つまり、somearray[1000] はグローバル変数であり、上記の関数をメイン関数からグローバル関数として呼び出すと、すべてが魅力的に機能します。

しかし、メイン関数から次のことを行うと:

int main()
{
  exampleclass::set_array();
  for (int i=0; i<20; i++)
  {
      std::cout << exampleclass::somearray[i] << std::endl;
  }
  return 0;
}

私が得る出力は次のとおりです。

0
0
0
...
0

myfile.datから読み取った値を出力することを期待していますが。

私は何を間違っていますか?提供した関数で静的メンバーを変更するようにクラスに指示するにはどうすればよいですか?

4

2 に答える 2

0

配列で演算子 sizeof() を使用しても、常に期待どおりに動作するとは限りません。ここで説明されているように、コンテキストに応じて、配列は単なるポインターとして解釈できます。

あなたが実際にやりたいことは、freadに変更することだと思います:

size_t numread = fread(somearray, sizeof(int), 1000, fin);
于 2013-02-14T13:34:36.233 に答える
0

fread はストリームから文字として読み取ると思う (私の推測) ので、 somearray をstatic char somearray[1000]に変更してみてください。うまくいくと思います

注 : fread は "\0" を 1 文字として読み取ります

于 2013-09-30T02:00:24.130 に答える