• ベストアンサー

次のプログラムを簡単にしたいです。

   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ファイルから画像を読み込みたいのですが、何かいい方法はないでしょうか?

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

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

画像ファイル名に規則性があるなら、 stringstream filename; for ( int i = 0 ; i < 100 ; i++ ) {  filename << "image" << i+1 << ".bmp";  img_file.push_back(filename.str());  filename.str(""); } とでもしておけばよいのでは?

evilspirit
質問者

お礼

上記の方法でimg_fileに格納することができました。 ありがとうございます。 stringstreamの使い方がまだ分かっていないので、本で見てみます。

evilspirit
質問者

補足

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(""); }

その他の回答 (7)

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.8

>img_file.push_back((std::sprintf(buff,"image%d.bmp",i),buff)); 一瞬わからず悩んでしまった。。。

evilspirit
質問者

補足

良く思いつきますよね。。。

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

evilspirit
質問者

お礼

問題なく使用できました。 こんな使い方もできるんですね。 すっごい参考になりました。 ありがとうございます。 プログラムのいろいろな使い方はどこで習うんでしょうね。。。?

evilspirit
質問者

補足

for文の中で++iを使っていますが、 i++ではだめなのですか? ++iは使ったことありません。。。。

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

あれ? #2 の「補足」のあたりですが, vector<string> img_file(m); でとってあるなら push_back は不要では?

evilspirit
質問者

お礼

そうですよね。 push_backを調べていたら、要素を追加すると書いてありましたが、 また別のファイルに格納する場合は不要ですよね? 一つ疑問点がとれました。 ありがとうございます。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

NO.3 です。 失礼しました(++はサッパリ判りません)。 ★img_file の宣言が char img_file[300][16]; と、Cライク(?)の場合です。 上記の宣言で試して下さい。

evilspirit
質問者

お礼

stringを使用しないんでcharで宣言したら、使用することが出来ました。 ありがとうございます。 stiringを使用するのと、charで宣言するのと、何が違うのでしょうね? ちょっとまだ勉強不足です。 今回使用する、部分に関して言えば、どちらでやっても大丈夫そうですが、一体どんな違いがあるのでしょう。。。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.4

img_file[i] は std::string だから、直接 sprintf() では書き込めないと思う。

evilspirit
質問者

お礼

やはりそうなのですか。。。 ありがとうございます。

evilspirit
質問者

補足

すみません。No2さんの回答の補足なのですが・・・ img_file.push_back(filename.str()); は必要なのでしょうか? これがないと安定しないとかあるのでしょうか? forの一回ごとにimg_file[]に格納しているので必要ないように思えます。 分かる方いましたらお願いします。

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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 ・ ・ の結果が得られます。

evilspirit
質問者

お礼

エラー 1 error C2664: 'sprintf' : 1 番目の引数を 'std::basic_string<_Elem,_Traits,_Ax>' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照) というエラーがでてしまいます。 ご教授願えますか?

noname#60636
noname#60636
回答No.1

for (int i = 0; i < 300; i++) {  char filename[20];  snprintf(filename, sizeof (filename), "image%d.bmp", i+1);  img_file[i] = filename; }

evilspirit
質問者

お礼

すみません。使用してるのがvisual studio2008です。 snprintfは標準で使用することが出来ません。

関連するQ&A

  • OpenCVでのcvCreateVideoWriterがうまくいきません

    今回複数枚のbmp画像群を、その画像につけられた4桁の連番の順に順次AVIファイルのフレームとして格納して行き、最終的にひとつのAVIファイルを出力するというプログラムを書いていますが、OpenCVの関数である「cvCreateVideoWriter」で躓いています。 CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 ); という仕様で、第二引数に「-1」と入れることで、プログラム実行時ffmpegが自動的にどの動画像コーデックを使用するかを聞いてくるということだったのですが、そうしているにも関わらずコーデック選択画面は出ないどころか、出力された動画(avi)も再生できない破損したファイルとして出力されてしまいます。 何かコーデックをインストールする必要があるのか(動画のコーデックとして、Combined Community Codec Packをインストール済みです)、それともプログラム内にまずい箇所があるのか、わからなくてあせっています。どなたかわかる方いらっしゃいましたらご教授よろしくお願いいたします。 ソース↓↓ //--------------------------------------------------------- // bmp→aviコンバート //--------------------------------------------------------- #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> #include <iostream> using namespace std; #include <fstream> int main(int argc, char** argv) { //変数定義----------------------------------------------- int key=NULL; IplImage* img = NULL; //読み込んだ画像ファイル用 char* outputWindow = "Output"; //進行状況確認用ウィンドウ CvVideoWriter* VideoWriter = NULL; //ビデオライタ char* filename = "test.avi"; //出力ファイル名 double fps = 30; //ビデオのフレームレート int i=0; //画像の連番カウント用 char ImageName[104]; //読み込む画像ファイル名 char NameTmp[100]; //上の連番なし //-------------------------------------------------------- //元画像の読み込み&フレームへの埋込み---------------------------------------------- cout << "画像名を入力してください(4桁連番号省略)" << endl; cin >> NameTmp; sprintf(ImageName,"%s0000.bmp",NameTmp); img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE); //画像一枚目の読み込みの if(img==NULL){ cout << ImageName << "の読み込み失敗" <<endl; return 1; } //進行状況確認用ウィンドウ展開 cvNamedWindow(outputWindow, CV_WINDOW_AUTOSIZE); //ログファイル展開 std::ofstream ofs; ofs.open( "test.txt" ); ofs << "1枚目の画像展開成功" << std::endl; //ビデオライタ展開 VideoWriter = cvCreateVideoWriter(filename, -1, fps, cvGetSize(img), 0); ofs << "ビデオライタ展開" << std::endl; while(img!=NULL){ //画像ファイルの連番に合わせて読み込むファイル名を変更 if(i<10){ sprintf(ImageName,"%s000%d.bmp",NameTmp,i); } else if(i<100){ sprintf(ImageName,"%s00%d.bmp",NameTmp,i); } else if(i<1000){ sprintf(ImageName,"%s0%d.bmp",NameTmp,i); } else{ sprintf(ImageName,"%s%d.bmp",NameTmp,i); } //進境状況をウィンドウに出力 cvShowImage(outputWindow, img); //進行状況確認用。10ms待つ key = cvWaitKey(10); //ビデオ書き込み cvWriteFrame(VideoWriter,img); cout << ImageName << endl; i+=1; img = cvLoadImage(ImageName, CV_LOAD_IMAGE_GRAYSCALE); //次のフレーム画像の読み込み ofs << i << "枚目の画像書き込み成功" << std::endl; } //ビデオ書き込み用メモリを開放 cvReleaseVideoWriter(&VideoWriter); //ログファイルを閉じる ofs.close(); //進行状況確認ウィンドウを閉じる cvDestroyWindow(outputWindow); return 0; }

  • [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++の初心者です。 ↓のプログラムの動作はさっぱりわかりませんが、それについての説明は具体的に教えていただきたいです。(できれば、詳しく) #include <iostream> #include <string> int getNinzu(int ARGC, char *ARGV[]) throw (char const *){ if(ARGC!=2){ throw "Needs only one argument."; } int ninzu=std::atoi(ARGV[1]); if(ninzu<=0){ throw "Value is too small."; } return ninzu; } #include <cstdlib> #include <ctime> int randfive(){ static bool firsttime=true; if(firsttime){ firsttime=false; std::srand(std::time(NULL)); } return static_cast<int>(static_cast<double>(std::rand())/RAND_MAX*(5+1)); } #include <iomanip> int main(int ARGC, char* ARGV[]){ std::string cmdname=ARGV[0]; int ninzu; try{ ninzu=getNinzu(ARGC,ARGV); std::cout << std::setfill('0'); for (int i = 1; i <= ninzu; ++i) { int score = 0; for (int k = 0; k < 20; ++k) score += randfive(); std::cout << "C" << std::setw(5) << i << " " << score << '\n'; } }catch(char const *str){ std::cerr << str << std::endl << "Usage: " << cmdname << " ninzu" << std::endl; return 1; } }

  • FORTRANのプログラム

    今、実験の解析を行っています。 読み込みたいテキストファイルには -1,0.4 0,0,233 -1,0.9 ・・など左側には-1か0のどちらかがあります。 これを -1,0.4 -1,0.9 を含むファイルと 0,0.0233 を含むファイルの二つに分けたいのです。 今プログラムを作っているのですがどうしてもできません。 どうしたらいいのでしょうか? program dat real x(10), y(10) open(7,file='test.txt') do i=1,10 read(7,*,end=200) x(i),y(i) end do do j=1,10 if(x(j).eq.0.0) then open(8,file='aftest1.txt') write(8,*) y(j) else open(9,file='aftest2.txt') write(9,*) y(j) end do close(8) close(9) 200 close(7) end

  • プログラムの動作の仕方

    この下のプログラムは、WRITE <ファイル名>をコマンド行で入力すると、動作するプログラムなのですが、この通りにWRITE <test>としてもできません。 やり方を教えてください. #include <iostream> #include <fstream> using namespace std; int main(int argc,char *argv[]) { if(argc!=2){ cout << "使い方:WRITE<ファイル名>" << endl; return 1; } ofstream out(argv[1]); //出力ファイル if(!out){ cout << "出力ファイルが開けません" << endl; return 1; } char str[80]; cout << "文字列をディスクに書き込み、$で停止します" << endl; do{ cout << ": "; cin >> str; out << str << endl; }while(*str!='$'); out.close(); return 0; } お願いします。

  • Image::Magickでサムネイル画の表示

    Image::Magickでサムネイル画の表示するCGIです ./image       属性は777 /$fmain_no.jpg    属性は644 サムネイル画を表示するとプロバイダーのサバーに保存されている画像も小さくなってしまいました、困っています、 サバーにある画像はそのままで画像を読んでサムネイル画を表示するようにしたいのですがよろしくお願いします。 use Image::Magick; $img_file = "./image/$fmain_no.jpg"; $height = 200; $i = Image::Magick->new; $i->Read($img_file); $i->[x]->Scale("x$height"); $i->Write("$img_file"); print "<IMG SRC=\"$img_file\" BORDER=0>\n";

  • C言語による構造体の値渡しについて

    以下プログラムを作成しました。 1.read_file関数によりファイルを読み込み。 2.avg_kokugo関数により、国語の平均点を出す。 という流れで組まれているのですが、 1.read_file関数実行時に、dat構造体を渡しています。 2.read_file関数内で、fscanfによる読み込みを行い、dat[i].name,&dat[i].kokugo,&dat[i].sansuに格納しているみたいに感じます。 ここで、疑問なのが、 「構造体を値渡しでdatをread_file関数に渡してる」と思っているのですが、 「read_file関数から、値渡しで渡された構造体datに、値を格納することはできるのでしょうか?」 本を参考にして勉強していたのですが、 「構造体は、値渡しの時に読み込みはできるが、更新はできない」 と書かれていたのです。(ポインタ参照渡しの時は可能。) なぜ今回、read_file関数から、構造体datに値の格納ができるのでしょうか? 更新と新規格納は意味が異なるからなのでしょうか? ご教授よろしくお願いします。 <ソース> #include <stdio.h> //グローバル #define FNAME "test.txt" struct score{ char name[20]; int kokugo; int sansu; }; int read_file(struct score dat[],int n); float avg_kokugo(struct score dat[],int n); int main(void){ struct score dat[3]; int ret; float kokugo; float sansu; ret= read_file(dat,3); if(ret <0){ return 0; } kokugo = avg_kokugo(dat,3); printf("国語の平均 %.1f\n",kokugo); return 0; } int read_file(struct score dat[],int n){ FILE *fp; //ファイルポインタ int i; fp=fopen(FNAME,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return -1; //-1によるプログラム強制終了 } //データ読み込み i=0; //datに保存していく。 while((fscanf(fp,"%s%d%d",dat[i].name,&dat[i].kokugo,&dat[i].sansu)) != EOF){ i=i+1; //ファイル件数読み込み } fclose(fp); return 0; } float avg_kokugo(struct score dat[],int n){ int sum; //合計 float answer; int i; sum=0; for(i=0;i<n;i++){ sum = sum + dat[i].kokugo; } //平均点を求める answer =(float)sum / (float)n; return answer; }

  • fortranのopen文について。

    fortranのopen文のファイル名を指定するするとき、doループで名前を変えたいのですが、どのようにやればよいでしょうか? 具体的には、 do i=1,2 open(unit=10+i,file='file.dat',status='replace') とした時、unitと共にファイル名も'file1.dat'、'file2.dat'と変わるようにしたいのです。 よろしくお願いします。

  • 【VB2005】画像の切り出し

    こんばんは。 VB2005で、画像ファイルの一部を切り出し、Image型の変数に格納する方法が分かりません。 (DrawImageメソッドで切り出した画像を描画する事はできました) 【例】 Dim i As Integer Dim sourceImg As Image = Image.FromFile("test.bmp") Dim img(9) As Image For i = 0 To img.Length - 1   img(i) = [sourceImgの一部] Next どなたか、ご教授頂けないでしょうか?

  • マイ ネットワーク\サーバーA(仮) の絶対パスはどう書く?

    マイ ネットワーク\サーバーA(仮) の絶対パスはどう書く? JavascriptとPhotoshopを使い、指定フォルダに画像を書き出すのが目的です。 試しにDドライブ「BMP」フォルダを指定するとこうなります。 //書き出す場所を指定、ファイル名=レイヤーカンプ名.bmp img = new File("D:\\BMP\\" + activeDocument.layerComps[i].name + ".bmp"); Dドライブ「BMP」フォルダに~.bmpが書き出されます。 "D:\\BMP\\" の部分を "\\サーバーA\\BMP\\"とすると 「C:\サーバーA\BMP\という指定先は見つからないというエラーが出ます。 どうパスを書けばいいのかわかりません。

専門家に質問してみよう