こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

c++ 出力ファイル名

c++ 初心者 です。fortran 77fortran 90でしたら幾分わかります。

c++ のプログラムで、for 文やwhile文の中に出力させる文章を置いて、出力されるファイル名をforやwhileの変数に関連ずけるには、どういったものを書けばよいでしょうか?

たとえば、以下のようなプログラムを書いて実行すると、"test"という文が書かれた"1"というファイル名のファイルが出力されます。

/ / / / / / / / / / / / / / / / / / /
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ofstream of;
of.open("1", ios::app);
of << "test" << endl;
of.close();
return 0;
}
/ / / / / / / / / / / / / / / / / / /

上のプログラムの中の出力ファイル名は"1"ですが、これをfor文等のループの中で"1"~"10"として10個のファイルを出力したいです。

以下のように書くと、"i"というファイルに"test"という文字が10個書き込まれます。

/ / / / / / / / / / / / / / / / / / /
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
int i;
ofstream of;
  for(i=0; i<=10; i++) {
    of.open("i", ios::app);
    of << "test" << endl;
    of.close();
}
return 0;
}
/ / / / / / / / / / / / / / / / / / /

上のプログラムの中の"i"のクオーテーションマーク""をとって

of.open(i, ios::app);

のように書いたらエラーでコンパイルできません。また、

of.open((char*) i, ios::app);

のように書くとコンパイルはできますが、ファイルができません。

ファイル名"1"に"test"
ファイル名"2"に"test"
ファイル名"3"に"test"



ファイル名"10に"test"

という風に出力できればいいのですが...


わかる方すみませんが、ご指導願います

投稿日時 - 2012-04-24 11:31:41

QNo.7438632

困ってます

質問者が選んだベストアンサー

>> ご回答頂いたものを"test9.cpp"ファイルに入れて、コンパイル(cyglaunch.exe上でg++ (ファイル名))してみますと、以下のようなエラーメッセージがでてきました。

環境が違うようなので、以下を試してみてください。
g++は触ったことがありませんが、恐らく宣言されている引数の型が違うのでしょう。

of.open(oss.str().c_str(), ios::app);

投稿日時 - 2012-04-26 17:39:50

お礼

度々すみません、記して頂いたようにしましたらできるようになりました。

どうもありがとうございました!

投稿日時 - 2012-04-26 23:31:12

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

FORTRAN77 がそれでいいなら

ofstream of[10];
of[0].open(....);
of[1].open(....);
// 以下略
for (int i = 0; i < 10; ++i)
of[i] << "test" << endl;

とでもする.

投稿日時 - 2012-04-26 13:44:17

お礼

すみません、度々ご回答ありがとうございます。

もう少しfortran流に考えてみます。

投稿日時 - 2012-04-26 23:32:51

ANo.2

C++ ではなく Fortran だったらどう書きますか?

まさか,
integer i
open(10, file=i)
などとは書きませんよね.

投稿日時 - 2012-04-24 12:00:40

お礼

すみません、返事遅れました。
ご回答、ありがとうございます。

そうですね、fortran 77 だと、

-------------------------

open(1,file="1")
open(2,file="2")
open(3,file="3")


open(10,file="10")

do 20 i= 1,10
write(i,*) test
20 continue
end

-------------------------

でできるのですが、C++だと、まだまだ勉強不足でどのようにすればいいのか見当がつきません..

もう少し、自分なりに考えてみますね。

投稿日時 - 2012-04-26 10:00:21

ANo.1

C/C++言語では基本的に文字列と整数が区別されます。
"1"、"i"  →文字列
i →整数
(char*)i →整数をむりやり文字列にキャストした物

ですので、整数を文字列に変換する必要があります。
やり方は色々ありますが一例として。
-----------------------------------------------
#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
 int i;
 ofstream of;

 for(i=0; i<=10; i++)
 {
  ostringstream oss;
  oss << i;

  of.open(oss.str(), ios::app);

  of << "test" << endl;
  of.close();
 }
 return 0;
}
-----------------------------------------------

投稿日時 - 2012-04-24 11:57:13

補足

ご説明、ありがとうございます。返事が遅れてしまい、申し訳ございません。「教えてGoo!」の操作に少々手間取っていました。。


ご回答頂いたものを"test9.cpp"ファイルに入れて、コンパイル(cyglaunch.exe上でg++ (ファイル名))してみますと、以下のようなエラーメッセージがでてきました。

- - - - - - - - - - - - - - - - - - - - - - - - - -

$ g++ test9.cpp
test9.cpp: In function `int main()':
test9.cpp:17: error: no matching function for call to `std::basic_ofstream<char, std::char_traits<char> >::open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, const std::_Ios_Openmode&)'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/fstream:695: note: candidates are: void std::basic_ofstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]

- - - - - - - - - - - - - - - - - - - - - - - - - -

これからこのエラーメッセージを自分なりに検証していきたいと思います。
やり方は色々あるとのことですが、上記に示して頂いた方法を是非使えるようになりたいと思いますので、もし何か訂正箇所がありましたら、度々すみませんが、宜しくお願いします。

投稿日時 - 2012-04-26 09:50:54

お礼

すみません、上に書いた「補足」(↑)は「お礼入力」にするべきでした。。

投稿日時 - 2012-04-26 10:03:25