1

(あまり大きくない) テキスト ファイルの内容を文字列に読み込むためのワンライナーはありますか?

私が見つけた最短:

#include <string>
#include <fstream>
#include <streambuf>

std::ifstream t("file.txt");
std::string str((std::istreambuf_iterator<char>(t)),
                 std::istreambuf_iterator<char>());

(大きなファイルの場合、ストリームから新しい文字を読み取るたびにバッファを再割り当てする必要があるため、非常に非効率的なソリューションであることに注意してください。)

クレジット: @Tyler McHenry ASCII ファイル全体を C++ std::string に読み込みます

4

2 に答える 2

8

次の 1 つのステートメントで実行できます。

std::string str(std::istreambuf_iterator<char>(std::ifstream("file.txt").rdbuf()), std::istreambuf_iterator<char>());

それがワンライナーかどうかは、モニターの大きさによって異なります...

于 2013-03-27T15:22:29.380 に答える
3

大きなファイルには適していないことに注意してください

「大きなファイルには適していない」というよりは、ストリームから新しい文字が読み取られるたびにバッファを繰り返し再割り当てする必要があるため、非常に非効率的なソリューションであると言えます。

また、この場合、コードの行数は、最も注意を払うべき指標の 1 つです。ifstreamオブジェクト (名前は よりも意味のあるものにする必要がありますt) を取得したら
、その状態と、それis_open()から読み取るはるかに合理的な方法がこの種のアプローチであるかどうかを確認する必要があります。

// obtain the size of the input file stream:
file.seekg(0, std::ios::end);
std::streampos fileSize = file.tellg();
file.seekg(0, std::ios::beg);

// read the file into the string:
std::string fileData(fileSize);
file.read(&fileData[0], fileSize);

「コード行が少ない」ということは、必ずしも「より良い」という意味ではありません。

于 2013-03-27T15:02:18.883 に答える