0

目的:配列をcharからunsignedintに適切かつ迅速に変換します。

私の仕事をチェックしてください-お願いします:

...
// NOTE:
// m_chFileBuffer is a member/variable from a class.
// m_nFileSize is also a member/variable from a class.
// iFile is declared locally as std::ifstream

// Calculate the size of iFile and copy the calculated
// value to this->m_nFileSize
iFile.seekg( 0, std::ios::end );
this->m_nFileSize = iFile.tellg( );
iFile.seekg( 0, std::ios::beg );

// Declare this->m_chFileBuffer as a new char array
this->m_chFileBuffer = new char[ this->m_nFileSize ];

// Read iFile into this->m_chFileBuffer
iFile.read( this->m_chFileBuffer, this->m_nFileSize );

// Declare a new local variable
::UINT *nFileBuffer = new ::UINT[ this->m_nFileSize ];

// Convert this->m_chFileBuffer from char to unsigned int (::UINT)
// I might be doing this horribly wrong, but at least I tried and
// will end up learning from my mistakes!
for( ::UINT nIndex = 0; nIndex != this->m_nFileSize; nIndex ++ )
{
    nFileBuffer[ nIndex ] = static_cast< ::UINT >( this->m_chFileBuffer[ nIndex ] );

    // If defined DEBUG, print the value located at nIndex within nFileBuffer
    #ifdef DEBUG
    std::cout << nFileBuffer[ nIndex ] << ' ';
    #endif // DEBUG
}

// Do whatever with nFileBuffer
...

// Clean-up
delete [ ] nFileBuffer;

何かを得ましたか?: 目的を完了するためのより良い方法がある場合は、以下に投稿してください!

詳細: この概念をunsigned int std :: vectorに適用することは可能ですか?

4

2 に答える 2

4

これは、このような単純なタスクには多すぎるコードです。必要なのはこれだけです。

std::vector <unsigned int> v;
std::copy (std::istream_iterator <char> (iFile), 
           std::istream_iterator <char> (), 
           std::back_inserter (v));

またはさらに短い(@ 111111のおかげで):

std::vector <unsigned int> v 
{ 
       std::istream_iterator <char> (iFile),
       std::istream_iterator <char> ()
};
于 2013-02-25T11:07:44.160 に答える
0
vector<char> buf(file_size);
/* read file to &buf[0] */
vector<unsigned int> uints(buf.size());
copy(buf.begin(), buf.end(), uints.begin());

生のnew/delete-usageは例外安全ではありません。経験則:デストラクタを自分で作成していない限り、コードにdeleteを記述しないでください。また、「char」が署名されている可能性がありますが、そこで期待する動作がわかりません。

于 2013-02-25T11:10:30.880 に答える