2017-03-01 15 views
0

std::streamsizeを使用して配列を作成することは、どうにかできません。 (ドイツ語からの翻訳)配列のサイズにstreamsizeを使用しても動作しません

// determine file size 
file.ignore(std::numeric_limits<std::streamsize>::max()); 
std::streamsize length = file.gcount(); 
file.clear(); 
file.seekg(0, std::ios_base::beg); 

// read data into buffer 
std::array<char, length> buffer; 
file.read(buffer.data(), length); 

// copy the game into memory 
std::copy(buffer.begin(), buffer.end(), memory.begin() + 0x200); 

エラーが

式は定数値でなければなりません

は、誰もがこの問題を解決する上の任意のアイデアを持っていますか?どんな助けもありがとう!

+2

配列を使用しないでください。ベクターを使用してください。 –

答えて

3

constexprの値は、テンプレートパラメータとして渡すことができます。この場合、実行時にのみサイズが分かっているため、この場合は明らかにできません。

std::arrayは、ジョブに間違ったツールを使用しているということです。std::arrayは、コンパイル時にサイズを知っていなければならない静的に割り当てられた配列をカプセル化します。動的割り当てが必要な場合は、std::vectorを使用してください。ただ、

// determine file size 
file.seekg(0, std::ios_base::end); 
std::streamsize length = file.tellg(); 
file.seekg(0, std::ios_base::beg); 

または:std::vectorstd::array間のより詳細な比較のために

あなたはファイルサイズを取得するには、あなたがfile.seekg()を使用することができますfile.ignore()を使用する必要はありませんstd::vector versus std::array in C++

+0

ああ、それでstd :: array、thanksを使うことができないのは意味があります:) – Urasam

2

を見ますWindowsではGetFileSize()、Linux(またはequivilents)ではstat()などのプラットフォーム固有のAPI関数を使用します。

つまり、std::arrayは固定長配列です。コンパイル時にそのサイズを指定する必要があります。実行時に動的な割り当てのために、代わりにstd::vectorを使用します。

// read data into buffer 
std::vector<char> buffer; 
buffer.resize(length); 
file.read(buffer.data(), length); 

それとも、単に直接ターゲット・メモリにファイルを読み込み、完全に一時バッファを避ける:

// read game file into memory 
file.read(memory.begin() + 0x200, length); 

または、でもファイルサイズを取得するスキップしますすべて:

// read game file into memory 
std::copy(
    std::istreambuf_iterator<char>(file), 
    std::istreambuf_iterator<char>(), 
    memory.begin() + 0x200 
); 

いずれの場合でも、メモリオーバーフローに注意してください。 memoryfileデータ全体を保持するのに十分な大きさであることを確認してください。

+0

さまざまなアプローチをありがとう! 最後の2つに大きな違いがありますか? 1つは他のものよりも優れています(例えばパフォーマンス) – Urasam

+1

大きなブロックを読んで読んだほうが、シングルバイト読取りよりもパフォーマンスが良いと思います。しかし、プロファイラーを使用して確認してください。 –

関連する問題