今日も躓く

メモメモ

C++98でファイルを一気に読み取りたい時

事情がありC++98でファイルを一気に読み取りたい時にちょっと困ったのでメモしておきます。

 

普通に"how to read file in cpp"とかでググると、ifstreamでファイルを開き、getlineで一行ずつ読み取る方法が出てきます。ただ、これで読み取ると改行までを読み取り、改行はスキップされるので、例えば改行がないファイルを読み取った時に最後に改行があるかどうかがわからない気がします(もしできたら教えてください)。

 

そこで、"how to read file with newline in cpp"とかでググったんですが、そこまで良い方法にヒットしませんでした。C++98ではできないのかと半ば諦め気味でしたが、ググり続けた結果、filestreamからstringstreamに文字列を吐き出す方法にたどり着けました。

 

std::ifstream ifs(filepath); // filepath : ファイルのパス
std::stringstream ss;
ss << ifs.rdbuf();
ss.str();

 

あと、ディレクトリが渡されたらエラーとしたい時はあると思います。しかし、ifstreamで読み込んだ時はおそらく判定方法がありません(もしできたら教えてください)。ググっても出てきませんでした。試行錯誤した結果、fstreamで読み込み、rdstateでビットパターンをチェックすれば良いとわかりました。

 

std::fstream ifs(path);
if (ifs.rdstate() != 0) { // 失敗したら0以外の値が返ってくる
std::cerr << "Error: Failed to open file" << std::endl;
std::exit(1);
}

 

ただ、rdstateだとファイルの権限がない時とディレクトリが読まれた時、両方とも同じ値が返ってくるので、そのケースでは使えません。もっと良い方法を知っている方は教えていただけると嬉しいです。

 

それでは