さて、前回の続きです。
これから複雑なプログラムを作成していくと、ソースコードの量が増えていき、どんどん読みづらくなっていきます。また、使いまわしたい関数なども増えていきまが、いちいち以前作ったプログラムを開いてソースコードをコピーするなんて面倒です。例えば、ファイル名、原子数、スピンチャージなどの読み取りなどは、gaussian の input または log ファイルの解析時に必ず必要となりますので、別ファイルにしてまとめておいたほうが使いまわしが楽です。
ファイルを複数に分割することで、コードが読みやすくなり、整理もしやすくなりますし、コードの使いまわしも楽になってきます。今回は、ソースコードを複数のファイルに分けて、gaussian の input ファイルの ファイル名 と 原子数 を読み取るプログラムを書いてみましょう。前回同様、プログラムは C++ で作成します。
まずは、ヘッダーファイルを作成します。(atom_number.h)
#include <iostream> #include <fstream> #ifndef atom_number_H_ #define atom_number_H_ //プロトタイプ宣言 void atom_count(char argv[], int &atom_number); #endif //atom_number_H_
続いて main 関数のファイルです。(atom_number_main.cpp)
// input ファイルの原子数を数えるプログラム。 #include <iostream> #include <fstream> #include "atom_number.h" int main(int argc, char *argv[]){ int atom_number(0); atom_count(argv[1], atom_number); std::cout << "ファイル: " << argv[1] << "の原子数は" << atom_number << std::endl; }
続いて原子数を数える関数のファイルです。(atom_number_function.cpp)
// input ファイルの原子数を数える関数 #include "atom_number.h" void atom_count(char argv[], int &atom_number){ int *Blank_Line; Blank_Line = new int[4]; // 空行の行番号を記録する配列 //cout << "ファイル名" << argv << endl; std::string str; std::ifstream ifs(argv); int l(0); int i(0); while(getline(ifs,str)){ l++; if(str == "// input ファイルの原子数を数える関数 #include "atom_number.h" void atom_count(char argv[], int &atom_number){ int *Blank_Line; Blank_Line = new int[4]; // 空行の行番号を記録する配列 //cout << "ファイル名" << argv << endl; std::string str; std::ifstream ifs(argv); int l(0); int i(0); while(getline(ifs,str)){ l++; if(str == "\0"){ Blank_Line[i]=l; i++; }if(i==3)break; } atom_number = Blank_Line[2] - Blank_Line[1] - 2; delete[] Blank_Line; }"){ Blank_Line[i]=l; i++; }if(i==3)break; } atom_number = Blank_Line[2] - Blank_Line[1] - 2; delete[] Blank_Line; }
ファイル作成後、メイン関数のファイルと原子数を数える関数のファイルをそれぞれコンパイルします。gcc/g++ でコンパイルする場合には、
g++ -c atom_number_main.cpp
と入力すると、main.o というファイルが生成します。(拡張子に着目してください。.o となっています。)
最後にそれぞれのファイルをまとめます。
g++ atom_number_main.o atom_number_function.o
今はまだファイルが二つだけですのでコンパイルも楽ですが、今後大規模なプログラム作成を行うために、makefile の書き方を覚えたほうが良いかもしれません。
間違いなどございましたら、コメントにて教えていただけたら幸いです。
よろしくお願い致します。