[備忘録] C++における連番ファイルの作り方

C++で連番ファイルをつくる

File1.txt、File2.txt・・・・のようにファイルの番号に数字をつけて連続で出力するプログラムをC++で書くのに少し苦労したので備忘録を示しておくことにしました。ファイルの出力には
・stdio
・iostream
があるのですが、stdioはfprintfなどを使用する方法、iostreamはfoutなどを使用する方法になっています。前者はC言語で、後者はC++言語でよく使用されています。今回はC++言語を学んでいるので、iostream形式でファイルを出力する方法を自分への備忘録もかねて紹介いたします。

サンプルプログラム

#include <fstream>
#include <iostream>
#include <sstream>

double t;
const double dt = 1.0, t_init = 0.0, t_end =10.0;

/*—————————*\
Class Output Declaration
\*—————————*/

class Output{
public:
void Format(double t);
private:
int i,j;
};

void Output::Format(double t)
{

std::ofstream fout;
std::stringstream FileName;
FileName << “File” << t << “.txt”;
std::string result = FileName.str();
fout.open(result.c_str());

fout << “This File t =” << t << std::endl;

fout.close();
return;
}

/*———————–*\
Class Declaration End
\*———————–*/

int main(void)
{

Output output;

t = t_init;
do
{
std::cout << “t = ” << t << std::endl;
output.Format(t);
t = t+dt;
} while(t <= t_end);

return 0;
}

プログラムの説明

動作説明

こちらはtを操作変数として、t=0からt=10までt=1刻みでファイルを出力するようなプログラムになっています。
つまり、これをコンパイル・実行すると
File1.txt
File2.txt
・・・
File10.txt
のファイル名のファイルが一度に出来上がります。

それぞれのファイルには「This File t = 〇」が書き込まれています。〇の部分は変数tに相当する数字です。

アルゴリズム説明

まず、グローバル変数としてtおよび定数としてdt(時間刻み)、t_init(開始時間)、t_end(終了時間)を定義しています。これらは連続してファイルを書き出すfor文で使用します。

クラスOutput メンバ関数Formatの説明

今回はファイル出力のためのクラス「Output」を用意しました。メンバ関数「Format」では1個のファイルを書き出すためのプログラムが書かれています。ここがプログラム全体の要です。

std::ofstreamでofstreamクラスを呼び出しています。このクラスはファイルへ出力するクラスです。このクラスを使用するにはfstreamをincludeする必要があります。ofstreamクラスに対するオブジェクトがfoutです。

次にファイル名を決めたいのですが、困ったことに、連番で使用するのは数字(1,2,3・・)であって、この数字はfor文を使って制御したいのでdoubleあるいはint型でなくてはいけません。しかし、オブジェクトfoutの関数openはchar型で機能します。(fout.open()の中はchar型でなければならないということです。)

そこで、数字の入ったファイル名を一旦string型にして、

std::stringstream FileName;
FileName << “File” << t << “.txt”;

そのあとにstring型である「FileName」をchar型に変換して

std::string result = FileName.str();

fout.open関数へ代入しています。

fout.open(result.c_str());

そして、ファイルの中には「This File t = 〇」を書き込みます。

fout << “This File t =” << t << std::endl;

main関数の説明

こうしてできたOutputクラスをmain内でオブジェクトにしてoutput.Format(t)として使用しています。for文で書かれているようにtの中には1,2,3・・と順番に数字が入り、Format関数の機能によって「File1.txt, File2.txt, ・・・」が作り出されていきます。

まとめ

上記の一連の動作はfprintfを使用したほうが簡単なのですが、私自身がオブジェクト指向に慣れるために、iostreamを使ってみました。iostreamは直感的操作に近いので、使い慣れればもしかしたらiostreamのほうが使い易いかもしれません。

また、私はC++を習い始めて1か月も経っていません。何か間違いがあるかもしれませんが、その時はご指摘いただければ幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です