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.あんまりスマートじゃないやり方かもだけどとりあえずこれで動く。