web-dev-qa-db-ja.com

C ++はバッファー内のファイル全体を読み取ります

C++のバッファ内のファイルコンテンツ全体を読み取るための良い方法は何ですか?

プレーンなCではfopen(), fseek(), fread()関数の組み合わせを使用してファイル全体をバッファに読み込むことができますが、C++でも同じものを使用することをお勧めしますか?はいの場合、オープン、バッファへのメモリの割り当て、バッファへのファイルコンテンツの読み取りおよび読み取り中にRAIIアプローチをどのように使用できますか?.

バッファのラッパークラスを作成する必要があります。このクラスは、デストラクタ内のメモリ(バッファに割り当てられた)の割り当てを解除し、ファイル処理用の同じラッパーを作成しますか?

27
vard

非常に基本的な機能のためのラッパークラスは必要ありません。

std::ifstream file("myfile", std::ios::binary | std::ios::ate);
std::streamsize size = file.tellg();
file.seekg(0, std::ios::beg);

std::vector<char> buffer(size);
if (file.read(buffer.data(), size))
{
    /* worked! */
}
54
jrok

入力ファイルストリーム std :: ifstream でファイルのコンテンツにアクセスできます。その後、 std :: istreambuf_iterator を使用してifstreamのコンテンツを反復処理できます。

_std::string
getFileContent(const std::string& path)
{
  std::ifstream file(path);
  std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());

  return content;
}
_

この場合、イテレータを使用してifstreamのコンテンツを使用して新しい文字列を作成する場合、std::istreambuf_iterator<char>(file)はifstreamの先頭へのイテレータを作成し、std::istreambuf_iterator<char>()はデフォルトで構築されます最初のイテレータがコンテンツの最後に到達したときに取得する特別な状態 "end-of-stream"を示すイテレータ。

16
AngelCastillo

私のほとんどのプログラムにあるもの:

/** Read file into string. */
inline std::string Slurp (const std::string& path) {
  std::ostringstream buf; 
  std::ifstream input (path.c_str()); 
  buf << input.rdbuf(); 
  return buf.str();
}

ヘッダーに配置できます。
ここで見つけたと思います: https://stackoverflow.com/a/116220/257568

13
ArtemGr