プロが教える店舗&オフィスのセキュリティ対策術

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"

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


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

A 回答 (4件)

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



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

of.open(oss.str().c_str(), ios::app);
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2012/04/26 23:31

FORTRAN77 がそれでいいなら



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

とでもする.
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2012/04/26 23:32

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



まさか,
integer i
open(10, file=i)
などとは書きませんよね.
    • good
    • 0
この回答へのお礼

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

そうですね、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

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;
}
-----------------------------------------------

この回答への補足

ご説明、ありがとうございます。返事が遅れてしまい、申し訳ございません。「教えて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
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/04/26 10:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!