C++プログラムでループの中でファイルを出力する方法

このQ&Aのポイント
  • C++のプログラムで、for文やwhile文の中に出力させる文章を置いて、出力されるファイル名をループの変数に関連づける方法を教えてください。
  • ループの変数としてファイル名を使い、C++のプログラムで複数のファイルを出力する方法を教えてください。
  • C++でファイルを出力する際、ファイル名にループの変数を関連づける方法がわかりません。ご教示いただけますか?
回答を見る
  • ベストアンサー

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" という風に出力できればいいのですが... わかる方すみませんが、ご指導願います

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

  • ベストアンサー
回答No.4

>> ご回答頂いたものを"test9.cpp"ファイルに入れて、コンパイル(cyglaunch.exe上でg++ (ファイル名))してみますと、以下のようなエラーメッセージがでてきました。 環境が違うようなので、以下を試してみてください。 g++は触ったことがありませんが、恐らく宣言されている引数の型が違うのでしょう。 of.open(oss.str().c_str(), ios::app);

kinounishimasu
質問者

お礼

度々すみません、記して頂いたようにしましたらできるようになりました。 どうもありがとうございました!

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

FORTRAN77 がそれでいいなら ofstream of[10]; of[0].open(....); of[1].open(....); // 以下略 for (int i = 0; i < 10; ++i) of[i] << "test" << endl; とでもする.

kinounishimasu
質問者

お礼

すみません、度々ご回答ありがとうございます。 もう少しfortran流に考えてみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

C++ ではなく Fortran だったらどう書きますか? まさか, integer i open(10, file=i) などとは書きませんよね.

kinounishimasu
質問者

お礼

すみません、返事遅れました。 ご回答、ありがとうございます。 そうですね、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++だと、まだまだ勉強不足でどのようにすればいいのか見当がつきません.. もう少し、自分なりに考えてみますね。

回答No.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; } -----------------------------------------------

kinounishimasu
質問者

お礼

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

kinounishimasu
質問者

補足

ご説明、ありがとうございます。返事が遅れてしまい、申し訳ございません。「教えて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>] - - - - - - - - - - - - - - - - - - - - - - - - - - これからこのエラーメッセージを自分なりに検証していきたいと思います。 やり方は色々あるとのことですが、上記に示して頂いた方法を是非使えるようになりたいと思いますので、もし何か訂正箇所がありましたら、度々すみませんが、宜しくお願いします。

関連するQ&A

  • C言語でのファイルへの出力について

    1つのプログラムで、複数のファイルを出力したいと考えております。 ファイル名も test_1.txt test_2.txt   ・   ・   ・ test_100.txt というように、番号のみ違うものに。 そして手動ではなく、for文などを用いてファイル名を決めたいです。 つまり、 for(i=0;i<100;i++){   fp = fopen("test_i.txt","w") } みたいなことをしたいのです。 でも上記のようだとエラーが出ます。 どうしたらよろしいのでしょうか…。

  • 1行ずつではなくまとめてファイル出力したいのですが

    Cは初心者です。というかプログラム自体ずぶの素人です。 パラメーター1パラメーター2パラメーター3を使って計算をし、結果として パラメーター1,パラメーター2,パラメーター3,数値2,数値3,数値4,数値5,数値6,数値7 というような形式で1行ファイル出力をし、 パラメーターを変えて(for文)またファイル出力をし、とかなりの回数繰り返す計算をしております。 (元々AWKで動いていた自作プログラムの移植です) 現在、 #include <fstream> ofstream file1("c:\\data.csv",ios_base::app |ios_base::out) ; file1 << parameter1 << "," << parameter2 << ~中略~ << "," << value1 << "," << value2 << "," << ~中略~ "\n" ; のようにファイル出力しているのですが、ファイルサイズがでかくなってくると、もの凄く遅くなります。 ひょっとして、ファイルオープン→ファイル末尾まで開く→1行書き込む→ファイルクローズ→ の繰り返しで、だからファイルが大きくなると遅くなるのではないかという気がしているのですが、 何行も(1000行とか1万行とか5万行とか)一気に出力する方法はないでしょうか? まず、どうやってデータを溜め込み、次にどういう出力方法があるのか、教えていただけないでしょうか。 parameter1~Value7(本当は倍以上ありますが)をそれぞれ全て配列にし、ファイルをオープンして閉じずにfor文で書き込む、なんてのも考えたのですが、どうしたら良いか判らずギブアップです。 もうちょっとスマートに、file1のところを配列にするとか、file1にどんどんデータを書き加えて巨大な一文にしてしまうとか、何か方法はないでしょうか? なお、cはマイクロソフトが只で配っているVisual Studio の VisualC++ Express Editionを、よく判らないまま使用しております。 先週ダウンロードしましたので、おそらく最新版だと思います。 ポインタの辺りは、理屈は解りましたがスラスラ使いこなせるということはなく、他人のソースを見てもよく判らない状態です。 というか、どこまで書き換えて良い文字で、どこまでが標準関数(?)等の書き換えられない文字かもよく解っていないレベルです。 よろしくお願いいたします。

  • [C++]ファイル出力について

    教えてください。 コマンドプロンプトから何行か書いた文章をファイルにしたいのですが、 うまくいきません。 作ったものの結果は1行1文字で出力されて、eofでうまく 終わってくれません。 コマンドプロンプトで入力(改行)された通りにファイルに出力 できるようにしたいので、どこがおかしいのか指摘お願いします。 #include <iostream> #include <fstream> #include <stdlib.h> #include <string.h> #include <string> using namespace std; int main(int argc, char *argv[]) { char str[100]; int i; i = 0; if (argc <= 1) { cerr << "Need filename" << endl; exit (1); } ifstream ifs(argv[1], ios::in); if (ifs) { cerr << "Caution" << argv[1] << " already exists " << endl; cerr << " Specify a different filename " << endl; exit (2); } ofstream ofs(argv[1], ios::out); if (!ofs) { cerr << " Unable to write to " << argv[1] << endl; exit (3); } while(str[i] !=EOF) { cin >> str[i]; ofs << str[i] << endl; i++; } return 0; }

  • C++でのファイル入出力について

    C++で計算したデータを何かファイルに保存しようとしています。 #include<iostream> #include<fstream> using namespace std; int main() { ofstream fout("test0.txt");     //ここで処理をしてファイルに書き込む作業を行う fout.close(); return 0; } 以上のようなサンプルがあったすると、ファイルはカレントディレクトリ に保存されますよね。 そのファイルの保存先を指定するようにするにはどうしたらいいですか? よろしくお願いします。

  • c言語のファイル出力について

    現在C言語の課題に取り組んでおり、ファイルの中身通りに出力させたいのですが 「ファイルの中身」 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 「出力結果」 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 こういう形で改行されて出てきてしまいます。 どなたか修正点を教えて頂けないでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { int r,i,n; FILE* fp; char sin[9][1000]; fp = fopen("log.txt", "r"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } for (i = 0; i < 9; i++) { fscanf(fp, "%s", &(sin[i])); } fclose(fp); for (i = 0; i < 9; i++) { printf("%s\n", sin[i]); } return 0; }

  • 入力した値をファイルに出力するプログラム

    C++でscanfなどで入力した値をファイルに出力するプログラムを作りたいのですがうまくいきません。下記のプログラムを書いてみたのですが入力した値を出力することができませんでした。どこを変更すればいいのかわかる方がいましたらご指導よろしくお願いします。 #include<iostream> #include <fstream> using namespace std; int main( ) { char ch; char ss[10]; int dt; int i,p; ofstream fileout; // 出力用ストリームの宣言 ifstream filein; // 入力用ストリームの宣言 fileout.open("sampledata.txt"); // 出力ファイルをオープン if (!fileout) // エラー処理 { cout << "エラー!出力ファイルをオープンできません\n"; return 1; } printf("IDを入力してください:"); scanf("%s",i); printf("\nパスワードを入力してください:"); scanf("%s",p); printf("\n登録しました。"); fileout << "ID=%d PASS=%s\n",i,p; // 文字列データ出力 fileout.close(); // 出力ファイルをクローズ filein.open("sampledata.txt"); // 入力ファイルをオープン if (!filein) // エラー処理 { cout << "エラー!入力ファイルをオープンできません\n"; return 1; } filein >> ch; // 文字データ入力 filein >> ss; // 文字列データ入力 filein >> dt; // 数値データの入力 cout << ch << '\n'; cout << ss << '\n'; cout << dt << '\n'; filein.close(); // 出力ファイルをクローズ return 0; }

  • C++でofstreamに空白を含む文字列を<<するとそれ以降の文字が書き込まれない

    以下のようなテストプログラムを書いたのですが、 期待した動作になりません。 #include <fstream> int main() { std::ofstream ofs("C:/test.txt"); char moji[] = "aaa bbb"; ofs << moji << std::flush; ofs.close(); } テキストファイルにはaaaしか書き込まれず、bbbが無視されています。 ifstreamが空白文字までで処理をとめるのは知っていましたが、 ofstreamが書き込む際も同じなのでしょうか。 空白を含む文字列を書き込むにはどうすればよいでしょうか? よろしくお願いいたします。

  • C++でファイル出力

    C++の初心者です。 あるデータをプログラムで計算し、それをファイル出力したいと考えております。 その際、10秒ごとに名前を変えてファイルを新規作成し出力ということはできるのでしょうか? たとえば、 int main(){ for(int i =0;i <10000; i++){ //cout << i << '\n'; /* ここでファイル出力をしたい */ /* 0から順に計算して改行し、出力 */ /* 最初は"hoge1.txt"に出力後、10秒ごとに"hoge2.txt"、 "hoge3..txt"と出力したい*/ /* hoge5.txtになったら終了 */ } } という感じです。 どなたか教えていただけませんでしょうか?

  • C++でのファイル書き込み

    現在C++でHTMLのファイルを作成しようとしているのですが ファイルに書き込むのは std::ofstream ofs( "test.txt", std::ios::out | std::ios::app ); ofs << "append test" << std::endl; という風な書き方でよいとおもうのですが、 HTMLファイルには <A HREF="index.html">back</A> のように""が含まれるのでこれをそのまま上の分に入れようとしてもおかしくなってしまいます なにかよい方法はないでしょうか?

  • ヘッダーファイルがインクルードされない(?)

    ダイアログ上のボタンをクリックすると指定されたテキストファイルをオープンし、 ファイルの内容をスペースで区切って格納するプログラムを http://oshiete1.goo.ne.jp/kotaeru.php3?q=474452 こちらを少し変えて作ったのですが、 コンパイル・デバッグを行なうと 'std' : 識別子がクラス名でも名前空間名でもありません。 'vector' : 定義されていない識別子です。 'ofstream' : 定義されていない識別子です。 と言ったようなエラーになってしまいます。 必要なヘッダーファイルはインクルードされているはずなのですが・・・。 この原因は何故でしょうか? /**********プログラムソース**********/ #include <iostream> #include <fstream> #include <string> #include <vector> #include <utility> #include "stdafx.h" #include "SCHEDULE.h" #include "SCHEDULEDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // ~中略~ void CSCHEDULEDlg::OnReq() {    typedef std::pair<std::string,std::string> item;    std::vector<item> participation;    std::ofstream file(dataFile.txt);    std::string line;    while ( std::getline(file,line) ) {      std::string::size_type pos = line.find(' ');      participation.push_back(item(line.substr(0,pos), line.substr(pos+1)));    }    for ( int i = 0; i < participation.size(); ++ i) {      std::cout << "result = " << participation[j] << "]\n";    } }

専門家に質問してみよう