3

前の質問で、ファイルからと同じようにメモリから読み取る方法を尋ねました。ファイル全体がメモリ内にあったので、同じように読みたかったのです。

私は自分の質問に対する答えを見つけましたが、実際には行をとして読む必要がありますwstring。ファイルで私はこれを行うことができます:

wifstream file;
wstring line2;

file.open("C:\\Users\\Mariusz\\Desktop\\zasoby.txt");
if(file.is_open())
{
    while(file.good())
    {
        getline(file,line2);
        wcout << line2 << endl;
    }
}   
file.close();

ファイルがASCIIであっても。

今、私は単にこの答えからの関数で私のstring行を変更しています。ただし、このメモリのチャンクをaと同じように扱う方法があれば、この行をsとして取得する方が高速な解決策になると思います。そして、私はこれが速い必要があります。wstringwistreamwstring

だから誰もがこのメモリのチャンクを?として扱う方法を知っていwistreamますか?

4

3 に答える 3

1

ASCII文字列に含まれる文字のサイズが異なるため、ASCII文字列をUNICODE文字列として扱うことはできません。したがって、一時バッファに何らかの変換を行ってから、そのメモリをストリームの入力バッファとして使用する必要があります。これはあなたが今していることです。

于 2010-12-04T14:15:01.707 に答える
1

あなたのデータはすでに目的のエンコーディングに変換されていると思います(@detunizedの回答を参照)。

前の質問に対する私の答えを使用すると、変換は簡単です。

namespace io = boost::iostreams;

io::filtering_wistream in;
in.push(warray_source(array, arraySize));

ブーストを使用しないと主張する場合、変換は次のようになります (それでも簡単です)。

class membuf : public wstreambuf // <- !!!HERE!!!
{
public:
    membuf(wchar_t* p, size_t n) { // <- !!!HERE!!!
        setg(p, p, p + n);
    }
};

int main()
{
    wchar_t buffer[] = L"Hello World!\nThis is next line\nThe last line";  
    membuf mb(buffer, sizeof(buffer)/sizeof(buffer[0]));

    wistream istr(&mb);
    wstring line;
    while(getline(istr, line))
    {
        wcout << L"line:[" << line << L"]" << endl;
    }
}

プレーンなUTF-8 ストリームを使用する理由についても、これを考慮してください。char

于 2010-12-10T09:55:30.047 に答える
0

string、 、および がある場合、 、、およびistreamistringstreamあることが明らかです。wstringwistreamwistringstream

istringstreamとはどちらも、それぞれ char と wcharwistringstreamのテンプレート クラスの単なる特殊化です。basic_istringstream

于 2010-12-04T14:27:11.230 に答える