11

ifstreamファイルからいくつかのデータを読み取るために使用するコードがいくつかあり、すべてが機能します。

今、私は、いくつかのコードを変更せずに、メモリからこのデータを読みたいと思っています。実際にはchar *、データを含む...

ファイルを効果的に読み取らずにchar *データをに入れるにはどうすればよいですか?ifstream

4

5 に答える 5

15

の使用std::istringstream(先頭に を付けずに誤って参照されることもありiます。そのようなクラスは存在しますが、出力ストリームも設定するため、構築にコストがかかります) は非常に人気がありますが、これにより、最小 — 実際の文字列の 1 つのコピー (ほとんどの実装では 2 つのコピーが作成されると思います)。単純なストリーム バッファを使用して、コピーの作成を回避できます。

struct membuf: std::streambuf {
    membuf(char* base, std::ptrdiff_t n) {
        this->setg(base, base, base + n);
    }
};
membuf sbuf(base, n);
std::istream in(&sbuf);

メモリの小さな領域の場合、違いは問題にならないかもしれませんが、保存された割り当てもそこで目立つ場合があります。メモリのチャンクが大きい場合、大きな違いが生じます。

于 2012-11-27T14:26:31.120 に答える
9

標準ライブラリは、書き込み可能なインメモリistreamも提供します: std::stringstream.

istreamの代わりにジェネリックを受け入れ、ifstreamを構築しstringstream、データを入力して関数に渡すように、コードを適切に抽象化する必要があります。

例えば:

const char* data = "Hello world";
std::stringstream str((std::string(data))); // all the parens are needed,
                                            // google "most vexing parse"

do_something_with_istream(str); // pass stream to your code
于 2012-11-27T13:13:38.163 に答える
9

を使用するコードをifstream&少し変更して を使用できる場合は、とistream&を簡単に切り替えることができます(メモリからデータを読み取るため)。ifstreamistringstream

void read_data(std::istream& in)
{
}

発信者:

std::istringstream in_stream(std::string("hello"));
read_data(in_stream);

std::ifstream in_file("file.txt");
read_data(in_file);
于 2012-11-27T13:14:36.870 に答える
1

文字列ストリームを検索している可能性があります。http://www.cplusplus.com/reference/sstream/stringstream/ . 以前に一度だけ使用したことがあり、長い間使用されていましたが、基本的にはメモリ内の場所からストリーミングできます.

于 2012-11-27T13:14:58.633 に答える
0

私のプロジェクトでは、バイナリ データを文字列ストリームに書き込むため、iostream の write() メソッドと read() メソッドを使用します。申し訳ありませんが、次のコードはテストされておらず、おそらく構文エラーがあります (オフィスからの入力... ;-) が、このようなコードを使用すると、メモリ、ファイル、およびその他の場所 (ネットワーク ソケットなど) に書き込むことができます。

void foo(std::iostream *mystream)
{
    mystream.write("Hello", 5);
    uint32_t i=5302523;
    mystream.write((char*) &i, sizeof i);
}

int main()
{
    // Write to memory. stringstream's write() and read() work binary
    std::stringstream memstream;
    foo(&memstream);

    // Write to file
    std::fstream f;
    try
    {
        f.open("file.dat");
        foo(&f);
    }
    catch (...)
    {
        // ...
    }

    if (f.is_open())
        f.close();

    return EXIT_SUCCESS;
}
于 2016-06-03T10:50:53.197 に答える