Visual C++をこの間まで使っておりました。VC++はmakefileを書かなくてもよかったり、自動で関数の名前チェックが入ったりして、結構便利なものでした。
ただ、起動に時間がかかったり、プロジェクトのファイルサイズが大きくなったりとやや不便なところもありました。ってことで、この前エディタをATOMに変えたとき、ついでにコンパイラをg++に、開発環境をMSYS2に変更したんですな。
MSYS2 : MSYS2 homepage
MSYS2はWindowsのコマンドプロンプトみたいに使えて、操作するディレクトリを指定してから、そのディレクトリ(あるいはそのディレクトリにあるファイル)に何らかの操作を行うっていう感じのものになります。その”何らかの操作”が、コンパイルとかリンクだったりするわけです。
ディレクトリ指定がちょっと厄介
ディレクトリを指定してから、何らかの操作を行うって言いましたけど、そのディレクトリ指定のときにちょっと煩わしい部分がありました。
Windowsで操作したいファイルのディレクトリは、右クリック→プロパティで表示できます。ただ、そこに表示されたパスは残念ながらそのままMSYS2でのディレクトリ指定には使えないんです。
というのも、WindowsでのパスはC:\~~\~~みたいに、各階層が\(バックスラッシュ、円マーク)で区切られています。それに対してMSYS2では、/C/~~/~~みたいに、各階層が/(スラッシュ)で区切られてるんですな。
なので、コピーしてすぐさまディレクトリ変更ってことができず、一回テキストファイルなんかにコピーしてから\を/に書き換えて(:も消します)から、ディレクトリ変更ってことをやっていました。
最初は良かったんですが、最近はそんな作業をやるのが面倒になってきまして、この手間を省きたいなーと思っておりました。(「じゃあ、なんでコマンドプロンプトでMSYS2を起動しないの?」、、、僕「だって!MSYS2使ってみたかったんだもん!」、、「あ、ハイ、オスキニドウゾ」)
自動化するプログラムを作りました
そんなこんなで、今日、ファイル入出力をやってみよーってことで色々やってたら、ふと思いつきまして、こんなプログラムを作りました。
目的:directory.txtに整形後のディレクトリパスを書きだす。
入力ファイルは適当なファイルで、中身はWindows式のパスだけを書いておく。
exeファイルに入力ファイルをドラッグ&ドロップ
→directory.txtに整形後のパスだけが書き込まれる
整形後はdirectory.txtを各プロジェクトのルートディレクトリにコピペします。
何かしらのプロジェクトを開発したいなって思ったときは、
そのプロジェクトのルートにあるdirectory.txtを開いてパスをコピー
→MSYS2にcdとパスをペースト
→準備完了!
っていう風にしてるんで、そんなプログラムがあったら便利だなぁ~と思ったんですな。
で、そんなプログラムを作ってみた結果がこちらのソースコードです。
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
if(argc != 2){
cout << "使い方 : CONVERT <入力ファイル名>\n";
return 1;
}
ifstream fin(argv[1]);
ofstream fout("directory.txt"); // 出力ファイルを開く
if(!fout){ // ファイルをストリームにリンクできない場合、偽が返される。
cout << "出力ファイルを開けません\n";
return 1;
}
if(!fin){
cout << "入力ファイルを開けません\n";
return 1;
}
char ch;
fout << '/';
while(!fin.eof()){
fin >> ch;
if(ch == '\\') ch = '/';
if(ch == ':') continue;
if( !fin.eof() ) fout << ch;
}
return 0;
}
exeファイルにドラッグ&ドロップすることを前提にしてるんで、コマンドライン引数を使っています。コマンドライン引数で入力ファイルを指定して、入力ファイルは指定された入力ファイルを、出力ファイルはdirectory.txtを開いています。
あとは、ファイルが問題なく開けたかどうかのチェックと、文字を一文字ずつ出力していくって操作をやってるだけです。
入力ファイルから入力された文字を調べていって\(バックスラッシュ)でなければそのままdirectory.txtに出力、\(バックスラッシュ)なら/(スラッシュ)に変えて出力ってのをファイルの最後までやってるだけです。
P.S.
MSYS2は使い勝手がかなり良くて、重宝しております。ほとんどの部分を自分で制御してやらないとダメなんですけど、その分動きが把握しやすくて気に入っています。ファイル間の関係を把握してる分、どこにダメなあ要素があるとか、何がダメだったかとかが分かりやすいんです。なんか、僕が完全にコントロールしてるような気分にさせてくれて (ただの勘違い) 、なかなか楽しいっすね~。