1
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>

int main()
{
    std::ifstream file("data.bin", std::ios::binary );

    if( file.fail() )
    {
        std::cout << "File does not exist or could not open file";

        return 0;
    }

    std::vector<short> buffer;

    std::copy( 
            std::istreambuf_iterator<char>( file ),
            std::istreambuf_iterator<char>(),
            std::back_inserter( buffer )
            );

   return 0;
}

これにより、char値の範囲(-128、128)のみが得られます。

使用istreambuf_iterator<short>すると私が望むものが得られると思いましたが、「無効な変換」エラーがスローされます。

範囲内のバイナリ値を読み取るにはどうすればよいshortですか?

4

2 に答える 2

2

クラスは、または、実際にはそのstd::istreambuf_iterator<cT>から抽出された文字を繰り返し処理します。つまり、特定のストリームタイプが与えられた場合、の選択肢はありません。また、IOStreamレイヤーは、ストリームバッファーに渡される操作にもかかわらず、バイナリファイルを操作することを目的としていないことに注意してください。std::basic_istream<cT, std::char_traits<cT>>std::basic_streambuf<cT, std::char_traits<cT>>std::istreambuf_iterator<cT>std::ios_base::binary

s(またはストリームの文字タイプ以外のタイプ)を抽出する場合shortは、ファイルが書き込まれた選択されたバイナリ形式を考慮に入れて、適切なイテレータを自分で作成する必要があります。このイテレータは、に基づいて構築することもstd::istreambuf_iterator<char>、直接アクセスすることもできますstd::streambuf

于 2012-12-02T01:32:39.770 に答える
1

これが私の推奨するスピリットアプローチです:

#include <fstream>
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

int main()
{
    std::ifstream file("data.bin", std::ios::binary);
    if(!file)
        std::cout << "File does not exist or could not open file";
    boost::spirit::istream_iterator f(file), l;

    std::vector<int16_t> buffer;
    bool ok = qi::parse(f, l, *qi::word, buffer);
}

もちろん、qi::dwordビッグqi::qwordエンディアン/リトルエンディアンのバリエーションなどがあります。


あなたはwchar_tを見ることができます

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
int main()
{
    std::wifstream file("data.bin", std::ios::binary );
    if( file.fail() )
    {
        std::cout << "File does not exist or could not open file";
        return 0;
    }
    std::vector<wchar_t> buffer;
    std::copy( 
            std::istreambuf_iterator<wchar_t>( file ),
            std::istreambuf_iterator<wchar_t>(),
            std::back_inserter( buffer )
            );
}

wchar_tの実際のサイズが実装で定義されているかどうかはよくわかりません。

于 2012-12-02T01:32:30.300 に答える