2015-04-21 144 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

相关问题