C++ STL 覚え書き

最近(仕事で)久しぶりにC++を触っている。Windowsだけど、Linuxでも動作するようにしなくちゃならんので、STLを使っているが、独特の雰囲気があって、戸惑うことも多く、ちょいちょい調べて対応してるが、ここに覚え書きとして書いておく。後に増やすかもしれない。

std::tr2::sys::path - ファイルパスを扱う

#include <filesystem>
std::tr2::sys::path pathname("/foo/bar.baz");
pathname.basename();//ファイル名から拡張子を抜いたもの
pathname.extension();//拡張子。最後のドット以降(ドット含む)
pathname.branchPath();//

std::transform() で stringを大文字に変換

#include <algorithm>
#include <string>

std::string str = "Hello World";
std::transform(str.begin(), str.end(),str.begin(), ::toupper);

std::ofstream::tellp() - ファイルの書き込み位置を取得する

ofstreamで開いたファイルの、現時点での書き込み位置を取得するには、tellp() メソッドを使用する。

プロトタイプ

#include <fstream>
streamoff ofstream::tellp();

サンプルコード

//追加書き込みで開く。なければ作成される
std::ofstream ofs;
ofs.open(pathname, std::ios::app);

//書き込み位置を取得する
std::streamoff writePosition = ofs.tellp();
if(writePosition < 0) {
    //失敗
}
if (writePosition == 0) {
    //ファイルの先頭
} else {
    //既存内容の最後に追加
}

ログ的な出力ファイルを追加書き込みモードで開いたとき、実際にはそのファイルの先頭から書き込もうとしているのかどうかを知りたかった。

ファイルを開く前に、ファイルサイズやファイルの存在をチェックする方法を取る人がいるかもしれないが、あまり良いやり方ではない。事前チェックをするのは良いが、その後実際に開くまでの、わずかな間にでもファイルの状態が変わりうるためだ。

まず対象のファイルを開いて、状況を変化させ得る他のプロセスをブロックし、それからチェックするのが望ましいし、よりシンプル。

0 件のコメント: