2017-03-01 59 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::vector

對於std::vectorstd::array之間更深入的比較看std::vector versus std::array in C++

+0

哦,那麼它是有道理不能使用std :: array,謝謝:) – Urasam

2

你並不需要使用file.ignore(),您可以使用file.seekg()獲得文件大小:

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

或者,只是使用特定於平臺的API函數,例如Windows上的GetFileSize()或Linux(或equivilents)上的stat()

也就是說,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 
); 

在任何情況下,一定要注意內存溢出!確保memory足夠大以容納整個file數據。

+0

感謝您的不同方法! 最後兩個有很大的區別嗎?比其他的更好(例如在性能上) – Urasam

+1

我認爲做大塊讀取比單字節讀取具有更好的性能。但使用探查器來確保。 –