C++でASCIIファイル全体をstd::stringに読み込む方法
C++では、テキストファイルの内容を一括してstd::stringに読み込む場面がよくあります。本記事では、ifstreamとostringstreamを組み合わせた、シンプルかつ効率的な方法を解説します。
アルゴリズム
処理の流れは以下の通りです。
ifstream型のファイルオブジェクトを使って、読み込み対象のファイル(例:a.txt)を開きます。- ファイル内容を格納するための
string型変数を宣言します。 - ファイルが正常に開けた場合(
if(f))、ostringstream型の変数を用意します。 rdbuf()関数を呼び出して、ファイルバッファのデータをストリームに流し込みます。str()メソッドでストリームの内容を文字列として取り出し、変数に代入します。- 最後に文字列の内容を出力します。
サンプルコード
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
using namespace std;
int main() {
ifstream f("a.txt"); // ファイルを入力ストリームとして開く
string str;
if (f) {
ostringstream ss;
ss << f.rdbuf(); // ファイルのデータを読み込む
str = ss.str();
}
cout << str;
}入力例
「hi」というテキストが書かれたa.txtというデータファイルを用意します。
実行結果
hi
補足:別の方法
C++11以降では、より簡潔な書き方も可能です。例えば、std::istreambuf_iteratorを使う方法や、ファイルサイズを取得してからread()で一括読み込みする方法があります。
#include<fstream>
#include<sstream>
#include<string>
std::string readFile(const std::string& path) {
std::ifstream f(path);
std::stringstream ss;
ss << f.rdbuf();
return ss.str();
}このように関数化しておくと、再利用性が高まりコードもすっきりします。用途に応じて最適な方法を選択してください。
-
C++でCSVファイルを読み込み・解析する2つの方法を解説
C++でCSVファイルを解析する場合、自分でファイルを読み込んで処理するよりも、ライブラリを利用することを強くおすすめします。CSVは一見単純な形式に見えますが、引用符で囲まれたカンマやエスケープ処理など、考慮すべきケースが数多く存在します。自前で実装すると、こうしたエッジケースを見落としてしまう可能性が高くなります。 C++向けのBoostライブラリには、CSVファイルを読み込むための便利なツールセットが用意されています。 Boost.Tokenizerを使った解析方法 以下は、Boostのtokenizerとescaped_list_separatorを使用して、1行のCSVデータを解析す
-
C#でファイルの内容を一度に文字列として読み込む方法
C#でファイルの中身をまとめて文字列として取得したい場合は、ReadToEnd() メソッドを使用します。このメソッドは、ストリームの現在位置から末尾までのすべてのテキストを一括で読み取るため、小規模なテキストファイルを扱う際に非常に便利です。 StreamReader クラスと組み合わせて、次のように記述します。 using (StreamReader sr = new StreamReader(new.txt)){ string res = sr.ReadToEnd(); Console.WriteLine(res); } using ステートメントを使うことで、処理が終