ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3989678 次のプログラムを簡単にしたいです。
質問者:evilspirit    std::vector< string > img_file(m);
img_file[0] = "image1.bmp"; ///< 画像ファイル名
img_file[1] = "image2.bmp"; ///< 画像ファイル名
img_file[2] = "image3.bmp"; ///< 画像ファイル名
img_file[3] = "image4.bmp"; ///< 画像ファイル名
img_file[4] = "image5.bmp"; ///< 画像ファイル名
img_file[5] = "image6.bmp"; ///< 画像ファイル名
img_file[6] = "image7.bmp"; ///< 画像ファイル名
img_file[7] = "image8.bmp"; ///< 画像ファイル名
img_file[8] = "image9.bmp"; ///< 画像ファイル名
img_file[9] = "image10.bmp"; ///< 画像ファイル名
img_file[10] = "image11.bmp"; ///< 画像ファイル名
img_file[11] = "image12.bmp"; ///< 画像ファイル名
img_file[12] = "image13.bmp"; ///< 画像ファイル名
             ・
             ・
             ・
             ・
img_file[99] = "image100.bmp"; ///< 画像ファイル名
/// 画像読み込み
if( !mist::read_bmp( image, img_file[i] ) ){///この部分でファイル名の画像を読み込み
cerr << "Could not read file: " << img_file[i] << endl;
exit(1);
}

のように画像を入力して、プログラムを回しています。
これからimageを200や300まで増やしたいと思っています。このままだと画像ファイル名を200行、300行書かなくてはならないので、なんとかforループや他のdatファイルから画像を読み込みたいのですが、何かいい方法はないでしょうか?
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/01 13:08
この質問に対する回答は締め切られました。

回答

ANo.8 >img_file.push_back((std::sprintf(buff,"image%d.bmp",i),buff));

一瞬わからず悩んでしまった。。。
回答者:koko_u_
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 20:51
この回答への補足良く思いつきますよね。。。
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答10pt

ANo.7 > stringstreamの使い方がまだ分かっていないので、本で見てみます。

では sprintf を使って:

std::vector<std::string> img_file;
char buff[32];
for ( int i = 0; i < 10; ++i ) {
 img_file.push_back((std::sprintf(buff,"image%d.bmp",i),buff));
}
回答者:episteme
種類:回答
どんな人:専門家
自信:自信あり
回答日時:
08/05/01 16:43
この回答への補足for文の中で++iを使っていますが、
i++ではだめなのですか?
++iは使ったことありません。。。。
この回答へのお礼問題なく使用できました。
こんな使い方もできるんですね。
すっごい参考になりました。
ありがとうございます。

プログラムのいろいろな使い方はどこで習うんでしょうね。。。?

回答

ANo.6 あれ? #2 の「補足」のあたりですが,
vector<string> img_file(m);
でとってあるなら
push_back
は不要では?
回答者:Tacosan
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 16:34
この回答へのお礼そうですよね。
push_backを調べていたら、要素を追加すると書いてありましたが、
また別のファイルに格納する場合は不要ですよね?
一つ疑問点がとれました。
ありがとうございます。

回答

ANo.5 NO.3 です。
失礼しました(++はサッパリ判りません)。

★img_file の宣言が char img_file[300][16];

と、Cライク(?)の場合です。
上記の宣言で試して下さい。
回答者:yama5140
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 16:22
この回答へのお礼stringを使用しないんでcharで宣言したら、使用することが出来ました。
ありがとうございます。
stiringを使用するのと、charで宣言するのと、何が違うのでしょうね?
ちょっとまだ勉強不足です。
今回使用する、部分に関して言えば、どちらでやっても大丈夫そうですが、一体どんな違いがあるのでしょう。。。

回答

ANo.4 img_file[i] は std::string だから、直接 sprintf() では書き込めないと思う。
回答者:koko_u_
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 14:42
この回答への補足すみません。No2さんの回答の補足なのですが・・・
img_file.push_back(filename.str());
は必要なのでしょうか?
これがないと安定しないとかあるのでしょうか?
forの一回ごとにimg_file[]に格納しているので必要ないように思えます。
分かる方いましたらお願いします。
この回答へのお礼やはりそうなのですか。。。
ありがとうございます。

回答

ANo.3 ★連続する数字を伴う文字列(ファイル名)の作成は、

 for( i = 0; i < 300; i++ ){

  sprintf( img_file[ i ], "image%03d.bmp", ( i + 1 ) );
 }

とすると、


image007.bmp
image008.bmp
image009.bmp
image010.bmp
image011.bmp


の結果が得られます。
回答者:yama5140
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 14:34
この回答へのお礼エラー 1 error C2664: 'sprintf' : 1 番目の引数を 'std::basic_string<_Elem,_Traits,_Ax>' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照)
というエラーがでてしまいます。
ご教授願えますか?

回答良回答20pt

ANo.2 画像ファイル名に規則性があるなら、

stringstream filename;
for ( int i = 0 ; i < 100 ; i++ ) {
 filename << "image" << i+1 << ".bmp";
 img_file.push_back(filename.str());
 filename.str("");
}

とでもしておけばよいのでは?
回答者:koko_u_
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/01 13:23
この回答への補足using namespace std;
const size_t m = 10;
vector< string > img_file(m);
stringstream filename;
for ( int i = 0 ; i < 10 ; i++ ) {
filename << "image" << i+1 << ".bmp";
img_file.push_back(filename.str());
cout << filename.str() << endl;
img_file[i] = filename.str();
filename.str("");
}
この回答へのお礼上記の方法でimg_fileに格納することができました。
ありがとうございます。
stringstreamの使い方がまだ分かっていないので、本で見てみます。

回答

ANo.1 for (int i = 0; i < 300; i++)
{
 char filename[20];
 snprintf(filename, sizeof (filename), "image%d.bmp", i+1);
 img_file[i] = filename;
}
回答者:noname#60636
種類:回答
どんな人:経験者
自信:自信あり
回答日時:
08/05/01 13:18
この回答へのお礼すみません。使用してるのがvisual studio2008です。
snprintfは標準で使用することが出来ません。