22

バイナリ ファイルから符号なしバイトを読み取りたい。そこで、以下のコードを書きました。

#include <iostream>
#include <fstream>
#include <vector>
#include <istream>

std::string filename("file");
size_t bytesAvailable = 128;
size_t toRead = 128;

std::basic_ifstream<unsigned char> inf(filename.c_str(), std::ios_base::in | std::ios_base::binary) ;
if (inF.good())
{
    std::vector<unsigned char> mDataBuffer;
    mDataBuffer.resize(bytesAvailable) ;
    inF.read(&mDataBuffer[0], toRead) ;
    size_t counted = inF.gcount() ;
}

これにより、変数 count で示されるように、常に 0 バイトが読み込まれます。

これを機能させるにはロケールを設定する必要があると言っている参考文献がウェブ上にあるようです。これを正確に行う方法は私には明らかではありません。

同じコードは、「unsigned char」の代わりに「char」データ型を使用して機能します

unsigned char を使用した上記のコードは Windows では動作するようですが、colinux Fedora 2.6.22.18 では実行できません。

Linuxで動作させるにはどうすればよいですか?

4

3 に答える 3

27

C ++は、2つのバージョンの文字特性に明示的な特殊化を提供するためにのみ実装を必要とします。

std::char_traits<char>
std::char_traits<wchar_t>

ストリームと文字列は、これらの特性を使用して、EOF値、文字範囲の比較、文字のintへの拡張など、さまざまなことを把握します。

次のようなストリームをインスタンス化する場合

std::basic_ifstream<unsigned char>

ストリームが使用できる対応する文字特性の特殊化があり、この特殊化が有用なことを行うことを確認する必要があります。さらに、ストリームはファセットを使用して、数値の実際のフォーマットと読み取りを行います。同様に、それらの特殊化も手動で提供する必要があります。この標準では、実装でプライマリテンプレートを完全に定義する必要はありません。したがって、コンパイルエラーが発生する可能性もあります。

エラー:特殊化std::char_traitsをインスタンス化できませんでした。

ifstream代わりに(これは)を使用basic_ifstream<char>してから、に移動してを読み込みますvector<char>。ベクトル内のデータを解釈する場合でも、unsigned char後で変換することができます。

于 2009-03-02T23:31:57.753 に答える
-1

はるかに簡単な方法:

#include <fstream>
#include <vector>

using namespace std;


int main()
{
    vector<unsigned char> bytes;
    ifstream file1("main1.cpp", ios_base::in | ios_base::binary);
    unsigned char ch = file1.get();
    while (file1.good())
    {
        bytes.push_back(ch);
        ch = file1.get();
    }
    size_t size = bytes.size();
    return 0;
}
于 2009-03-03T00:36:08.257 に答える