4

C (または C++) でこれを行う方法はありますか?

背景情報: メモリ ブロックまたは大きなファイルを 1 行ずつ読み取り、それらの行を 1 つずつ処理します。同じことを 2 回 (メモリ ブロック用に 1 回、ファイル ストリーム用に 1 回) 書くのが面倒です。 . ファイル ストリーム バージョンを使用する必要がある場合、ファイルはメモリに収まりません。当然のことながら、メモリ ブロックをファイルに保存し、ファイル ストリームを使用して同じデータにアクセスすることもできますが、それはコンピューター時間の浪費のようです。

Linux システムの /dev/shm について知っています。言語 (C または C++) のレイヤーで同じ種類の抽象化を提供する、より移植性の高いものはありますか?

4

3 に答える 3

8

C ではsprintfandsscanfを使用できます。文字列を使用して構築される std::stringstream クラスがありC++ますそのため、関数に as 引数を取り、ケースに応じてstd::istreamいずれかを渡すことができます。std::ifstreamstd::istringstream

于 2013-03-19T15:10:01.067 に答える
3

システムで使用できる場合は、関数open_memstream(3) とそれに関連する関数を使用できます。(glibc および POSIX 2008): open_memstream(3) man ページ、

于 2013-03-19T15:12:17.730 に答える
2

次のように、独自のストリーム バッファを作成できます。

#include <streambuf>
#include <istream>
#include <iomanip>
#include <iostream>

template<
    class CharT,
    class Traits = std::char_traits<CharT>
> class basic_MemoryBuffer : public std::basic_streambuf<CharT, Traits> {
public:
  basic_MemoryBuffer(CharT* ptr, std::size_t size)  {
    setg(ptr, ptr, ptr+size);
  }
};

typedef basic_MemoryBuffer<char> MemoryBuffer;

int main () {
  char data[] = "Hello, world\n42\n";

  MemoryBuffer m(data, sizeof(data)-1);
  std::istream in(&m);

  std::string line;
  while(std::getline(in, line)) {
    std::cout << line << "\n";
  }
}
于 2013-03-19T16:13:26.317 に答える