2015-04-21 101 views
2

我有這樣的代碼:我應該在這裏使用什麼類型的演員?

m_file.seekg(0, std::ios_base::end); 
int fileSize = (int)(m_file.tellg()); 
m_file.seekg(0, std::ios_base::beg); 
m_fileContent.resize(fileSize); 
m_file.read(m_fileContent.data(), fileSize); 

的想法是一個二進制文件的內容讀入一個載體。此代碼已編譯並運行良好,但我不確定此行在C++環境中是否正確?

int fileSize = (int)(m_file.tellg()); 

我是否使用正確的演員?這是一個C風格的演員,而不是一個C++。我想這施放,但它產生編譯器錯誤:

int fileSize = reinterpret_cast<int>(m_file.tellg()); 

,但我收到此錯誤:

'reinterpret_cast' : cannot convert from 'std::fpos<_Mbstatet>' to 'int'  

什麼是投值類型彼此最好的方法是什麼?我應該使用C風格演員還是C++風格演員?

+3

你不應該在這裏所有鑄造。如果'tellg'返回的值不適合'int'會怎麼樣? –

+0

通常,您可以使用'static_cast'進行顯式數值轉換。 'reinterpret_cast'在指針和引用上工作,做假冒他們指向/指向不同類型的更危險的工作。但是你不應該在這裏使用劇組。 –

+0

相關:[streampos和pos_type,streamoff和off_type之間有什麼區別?](http://stackoverflow.com/q/10133680/2718186) – MicroVirus

回答

3

你不應該造型處理,而是(假設C++ 11)使用auto, 即:

auto fileSize = m_file.tellg(); 

它將確保您不會使用錯誤的類型並避免可能最終導致丟失信息的隱式轉換(如從較大類型轉換爲較小類型)。另外,您不必打擾實際的類型(可能會很麻煩,而且可能會出錯)。

3

你不想鑄造可言,而是使用

size_t fileSize = file.tellg(); 
+0

或'auto fileSize = ...' –

+0

我可以用它來調整大小()一個向量? – mans

+0

@mans [Documentation](http://en.cppreference.com/w/cpp/container/vector/resize)表示「void resize(size_type count);」。 – molbdnilo

0

C++11之前,我相信做了正確的事情是這樣的:

std::fstream::pos_type fileSize = m_file.tellg(); 

如果你有C++11,那麼你可以這樣做:

auto fileSize = m_file.tellg(); 
+0

不'streampos','std :: ifstream :: pos_type'(假設'm_file'是'ifstream')。 – Barry

+0

@Barry固定。有趣。人們想知道什麼'std :: streampos'是..? – Galik

相關問題