しままるの雑記帳

しままるの思ったことや考えたことをアウトプットする場。「PC/プログラミング」「写真/旅行」「科学(勉強)」「心の問題」が主なテーマ。

プログラミング

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

投稿日:2017年4月9日 更新日:

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か月も経っていません。何か間違いがあるかもしれませんが、その時はご指摘いただければ幸いです。

-プログラミング

執筆者:


comment

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

関連記事

[備忘録] htmlにおけるベージ内ジャンプの方法

目次1 ページ内リンクのプログラム2 サンプルプログラム2.1 プログラムの説明3 動作確認4 使用例5 応用例5.1 応用例 動作確認 ページ内リンクのプログラム  ブログを書いていて、とりあえず結 …

イントロクイズの作り方 ~Audacityの使い方を解説~

目次1 作成する音源ファイル2 Audacityのダウンロード・インストール3 Audacityで音源を編集しよう3.1 問題音源の作成3.2 フェードアウト3.3 正解音源の作成4 まとめ5 原曲の …

[備忘録] htmlにおけるメッセージ展開のプログラム

目次1 メッセージ展開、収納のプログラム2 サンプルプログラム3 動作確認4 知っている人がいたら教えてください メッセージ展開、収納のプログラム  ブログを書いていると、ついつい文字数が多くなって、 …

【初心者向け図説】Linuxを使おう!(スマホ版)

プログラミング開発に便利な無料OS、Linuxを使おう ※本ページはスマホ版になっております。パソコンの方はこちら  Linuxと言う言葉を聞いたことがありますか?この記事ではLinuxでどんなことが …

簡単図説!自作PCを作ってみよう!

目次1 はじめに2 部品を揃える3 ハードウェアの組み立て3.1 CPUとクーラーをマザーボードに取り付ける3.1.1 グリースを塗る3.1.2 CPUをマザーボードに載せる3.1.3 CPUファンの …