boost::filesystemを使ってある拡張子のファイルの先頭行に文字列を


ちょっと必要になったので書いてみただけです。><

#include <iostream>
#include <string>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/xpressive/xpressive.hpp>

void replace_file(
  const boost::filesystem::path& dir,
  const std::string& inset_str)
{
  try {
    namespace fs = boost::filesystem;
    fs::recursive_directory_iterator end;
    for (fs::recursive_directory_iterator it(dir); it != end; ++it) {
      if (!fs::is_directory(*it)) {
        using namespace boost::xpressive;
        sregex r = sregex::compile( ".*\\.cpp|.*\\.h" );
        smatch m;

        if (regex_search(it->string(), m, r)) {
          std::string file_data(inset_str+"\n");
          fs::ifstream ifs(*it);
          std::copy(std::istreambuf_iterator<char>(ifs),
                    std::istreambuf_iterator<char>(),
                    std::back_inserter(file_data));
          ifs.close();
          fs::ofstream ofs(*it, std::ios::trunc);
          std::copy(file_data.begin(),
                    file_data.end(),
                    std::ostreambuf_iterator<char>(ofs));
        }
      }
    }
  } catch (std::exception& e) {
    std::cout << e.what() << std::endl;
  }
}

int main(int argc, char* argv[])
{
  std::locale::global(std::locale(""));
  if (argc < 2) {
      std::cout << "invalid argment" << std::endl;
      std::cout << "replacefile2 arg1 arg2" << std::endl;
      std::cout << "arg1: replace files path replace *.cpp|*.h" << std::endl;
      std::cout << "arg2: insert string" << std::endl;
      return 0;
  }
  replace_file(argv[1],argv[2]);
  return 0;
}

コンパイルしてできた実行ファイルをinsertstr4frontfiles.exeとすると。

insertstr4frontfiles.exe c:\src "// 一行目にコメントを追加"

こんな感じで実行します。
この例だと、c:\src配下の任意の.cppと*.hファイルの先頭行に"// 一行目にコメントを追加"が追記されます。
ps.あんまりスマートじゃないやり方かもだけどとりあえずこれで動く。