• 締切済み

テキストファイルに出力した結果の加算

 キーボードから'a'を入力した時点で'1'をテキストに書き込み、何も入力しない時は'0'を書き込むプログラムを作りました。  このプログラムを改良して、実行するたびに前のテキストの内容に実行結果を足していくようなプログラムを作りたいのですがどのように改良していけばよいでしょうか?  例えば、1回目に入力した時点と2回目に入力した時点がかぶっていたらテキストファイルにはその時点の数値が'2'となるようにしていきたいのです。  プログラムは以下です。 ------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <cxcore.h> #include <highgui.h> #include "cv.h" #include "image.h" #include "avi_w.h" //IplImage IplImage* src; IplImage* gray; IplImage* file; int main(void) { char wname[] = "input"; CvCapture* capture; IplImage *frame=NULL; char* captureWindow = "Capture"; int key; int count; int score[10000][1]; int i; int j=1; int k=0; char filename[256]; FILE *fp,*fq; time_t timer; struct tm *date; char str[1000]; //AVIファイルの読み込み・出力 capture = cvCaptureFromFile("video.avi"); cvNamedWindow(wname,1); frame = cvQueryFrame(capture); //キャプチャサイズを知るために画像取得 //変数群の定義 CvVideoWriter* VideoWriter = NULL; char* file = "movie.avi"; // 出力ファイル名 double fps = 30.0; // ビデオのフレームレート //ビデオファイル書き込みの設定 VideoWriter = cvCreateVideoWriter(file,-1,fps,cvSize(frame->width,frame->height),1); //画像表示ウィンドウの出現位置指定 cvMoveWindow(wname, 300, 300); //ファイルオープン fp = fopen("frame.txt","w"); fprintf(fp,"フレーム\n"); for(count=1;;count++){ frame = cvQueryFrame(capture); cvShowImage(wname,frame); key = cvWaitKey(30); if(frame == NULL) break; /*キー入力*/ else if(key == 'q') break; else if(key == 'a'){ //ビデオファイル書き込み cvWriteFrame(VideoWriter,frame); key = cvWaitKey(1); printf("aが%dフレーム目で入力されました\n",count); /*現在時間の取得*/ timer = time(NULL);/* 経過時間を取得 */ date = localtime(&timer);/* 経過時間を時間を表す構造体 date に変換 */ strftime(str, 255, "%Y, %B, %d, %A %p%I:%M:%S", date); printf("%s\n\n", str); //テキストファイルに出力 fprintf(fp,"[%03d] ",count); fprintf(fp," 1\n"); } else{ fprintf(fp,"[%03d] ",count); fprintf(fp," 0\n"); } } cvReleaseVideoWriter(&VideoWriter); cvReleaseCapture( &capture ); cvDestroyAllWindows(); fclose(fp); return 0; } ----------------------------------------------

みんなの回答

回答No.1

私が以前、貴方の同じような質問に回答をしていると思いますが。。。

参考URL:
http://oshiete1.goo.ne.jp/qa5417313.html
illckbc
質問者

お礼

 以前はありがとうございました。  前のプログラムでは実行のたびに結果の値が上書きされるので、 今回のプログラムでは実行を繰り返すたびにその結果を前に行った結果に加算していくように改良したいと考えています。  前の結果を配列に格納、保持し、次に実行する時にその結果を使い、加算を行うというのはできるのでしょうか?  どういった方法をとれば実装できるか教えていただけるとありがたいです。

関連するQ&A

  • open cvで配列の値をテキストに出力するプログラム

    こんにちわ。  今、open cvで映像を読み込みその映像の何フレーム目でキー入力がされたかを出力するプログラムを作成しています。  そこで、キー入力されたキーとその時のフレーム、時間の結果を配列に格納して、その内容をテキストに出力したいのですがうまくいきません。ファイル出力された結果は上書きされて最後に行ったキー入力の結果しか出力されません。全ての結果をテキストに出力できるようにしたいのでお願いします。  いろいろ不具合があると思うので教えてください。 ---------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "cxcore.h" #include "cv.h" #include "image.h" //読み込む動画ファイル名 char* input_filename="video2_result.avi"; //IplImage IplImage* src; IplImage* gray; IplImage* canny; int main(void) { char wname[] = "input"; CvCapture* capture; IplImage *frame; int key; int a[1000]; int count = 0; FILE *fp; time_t timer; struct tm *date; char str[256]; capture = cvCaptureFromFile("video2_result.avi"); cvNamedWindow(wname,1); for(;;){ frame = cvQueryFrame(capture); if(frame == NULL) break; cvShowImage(wname,frame); key = cvWaitKey(30); /*キー入力*/ if(key == 'q') break; if(key == 'a'){ printf("%d\n",count); /*現在時間の取得*/ timer = time(NULL);/* 経過時間を取得 */ date = localtime(&timer);/* 経過時間を時間を表す構造体 date に変換 */ strftime(str, 255, "%Y, %B, %d, %A %p%I:%M:%S", date); printf("%s\n", str); } count++; } cvReleaseCapture( &capture ); cvDestroyAllWindows(); //入力結果をファイルに出力 fp = fopen("frame.txt","w"); { fprintf(fp,"%d,\n",a[count]); fprintf(fp,"%s,\n",str); fprintf(fp,"\r\n"); } fclose(fp); return 0; } --------------------------------------------------- これが作成中のプログラムです。

  • OpenCV webカメラ同時出力について

    opencvで画像処理をしています。 Webカメラを2台同時に出力させるプログラムをつくりたいと思っているのですが、方法が全く分かりません。 どうすれば2台同時に出力させることができますか? 1台だけ出力させるプログラムはこちらを使っています。 #include <stdio.h> #include <highgui.h> int main( int argc, char** argv ){ int key; // キー入力用の変数 CvCapture *capture; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 // カメラを初期化する if ( ( capture = cvCreateCameraCapture( -1 ) ) == NULL ) { // カメラが見つからなかった場合 printf( "カメラが見つかりません\n" ); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); // メインループ while ( 1 ) { // カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); // 画像を表示する cvShowImage( windowNameCapture, frameImage ); // 'q'キーが入力されたらループを抜ける key = cvWaitKey( 1 ); if ( key == 'q' ) { break; } } // キャプチャを解放する cvReleaseCapture( &capture ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); return 0; }

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • 実行結果をフォルダに格納

     aviファイルの動画を1フレームずつの画像に分けていくプログラムを作りました。  hogehoge%05d.jpgで画像ファイルを生成していくようにしているのですが、この実行結果から得られた画像を、すべてフォルダに格納するように改良したいのです。どうしたらいいでしょうか?  プログラムは以下です。 ------------------------------- /* 警告warningを出なくする */ #pragma warning(disable : 4996) #pragma warning(disable : 4244) /* リンクするOpenCVライブラリ指定 */ #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"cv.lib") #pragma comment(lib,"highgui.lib") //#pragma comment(lib,"ipl.lib") #include <stdio.h> #include <stdlib.h> #include <string.h> #include "cxcore.h" #include "cv.h" #include "image.h" //読み込む動画ファイル名 char* filename="result1.avi"; //IplImage IplImage* src; int main(){ CvCapture* capture = NULL; int key; //キー入力 int fileCount; char fileName[256]; //指定したAVIファイルが見つからない場合 if(NULL==(capture = cvCaptureFromAVI(filename))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } //画像表示ウィンドウの準備 cvNamedWindow("Source Image", CV_WINDOW_AUTOSIZE); //画像表示ウィンドウの出現位置指定 cvMoveWindow("Source Image", 50, 50); //処理ループの開始 for(fileCount = 1;;fileCount++){ //AVIファイルからフレーム画像を取り出す if(NULL==(src=cvQueryFrame(capture))){ break; } //画像表示 cvShowImage("Source Image", src); //画像保存 sprintf(fileName,"hogehoge%05d.jpg",fileCount); cvSaveImage(fileName, src); // //キー入力 key = cvWaitKey(10); //ESCキーを押すと終了 if(key==0x1b) break; } //解放 cvReleaseCapture(&capture); cvDestroyWindow("Source Image"); return 0; } ---------------------------------

  • ファイルの出力

    コマンドラインで指定したファイルの内容を一行ずつ表示するプログラムです。一行表示するごとに次の行も表示するか尋ねます。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int main(int argc, char *argv[]) {  FILE *fp;  char str[80];  char ch;  if (argc != 2){   printf("コマンドライン引数が違います\n");   exit(1);  }  if ((fp = fopen(argv[1],"r")) == NULL){   printf("ファイルが開けません");   exit(1);  }  while(!feof(fp)){   fgets(str, 79, fp);   if (!feof(fp)) printf("%s",str);   printf("追加しますか?(y/n)");   gets(str);   if ( toupper(*str) == 'N') break;   printf("\n");  }     if (fclose(fp) == EOF){   printf("ファイルを閉じれません\n");   exit(1);  }  return 0; } while文の   gets(str);  if ( toupper(*str) == 'N') break; この部分を  ch = getchar();  if ( toupper(ch) == 'N') break; でやると上手く実行できないのですが、なぜでずか?

  • ファイル

    c言語初心者です。 どなたか教えていただけませんか? これだとiが定義されないことになってしまいます。 #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; fp=fopen("monai", "w"); if(fp==NULL){ fprintf(stderr,"ファイルのオープンに失敗しました。\n"); exit(0); } int i; for(i=1;i<=30;i++) { if(i<=9){ fprintf(fp," %d ",i); } else if(i%10==0) { fprintf(fp,"%d\n",i); } else { fprintf(fp,"%d ",i); } } fclose(fp); return 0; } ビルドもできません。

  • ファイル

    AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }

  • 【OpenCV】ハイビジョンaviファイル読み込み途中にファイルが終了してしまう問題

    現在、OpenCVを用いてハイビジョンのaviファイル(1440*1080)の画像処理を行うプログラミングを行っています。 aviファイルの読み込み・表示はOpenCVでは一般的な方法であるcvCaptureFromAVIとcvQueryFrameを用いて行っています。 この処理において最初の方はうまく処理が行えるのですが、処理が進むとファイルがまだ終わっていないのにも関わらず、cvQueryFrameでフレームが取得できず、処理が終了してしまいます。 ファイルが終了してしまうフレーム数も大体決まっており、mencoderで変換したファイルは約460フレーム目で、Adobe Media Encoderで変換したファイルは約910フレーム目でファイルが終了してしまいます。 メディアプレーヤーでaviファイルそのものを再生してみたところ、460フレーム目・910フレーム目以降のフレームも存在していることが確認されたので、本当にファイルが終了しているというわけではありません。 このままだと約30秒以上の動画は扱えず、非常に困っています。 確認として以下のプログラムで1000フレーム目から読み込むようにしてみたのですが、やはりすぐにファイルが終わってしまいます。 試しにハイビジョンでないaviファイル(640*480)で処理してみたところ正常に動作したのでエンコーダーの問題かプログラムの問題ではないかと思うのですが、何か少しでもお分かりの方がいらっしゃればご指導よろしくお願い致します。 <aviファイル読み込みプログラム> #include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h> char input_name[] = "hogehoge.avi"; int main(int argc, char** argv) { int key, i = 0; CvCapture* capture = NULL; IplImage* img = NULL; char* captureWindow = "Capture"; double prop; if(NULL==(capture = cvCaptureFromAVI(input_name))){ printf("指定のaviファイルが見つかりませんでした.\n"); return -1; } cvNamedWindow(captureWindow, CV_WINDOW_AUTOSIZE); prop = 1000.0f;       cvSetCaptureProperty(capture, CV_CAP_PROP_POS_FRAMES, prop); for(;;) { if(NULL==(img=cvQueryFrame(capture))){ printf("movieファイルが終わりました。\n"); break; } cvShowImage(captureWindow, img); printf("No.%dframe\n", i); i++; key = cvWaitKey(1); if (key == 0x1b) { break; } } cvReleaseCapture(&capture); cvReleaseImage(&img); cvDestroyWindow(captureWindow); return 0; }

  • 0と1のファイルへの書き込み、出力

    c言語で0と1の乱数を生成し、ファイルに出力したいのですが、出力がおかしくなってしまいます。 正しく0と1をファイルに書き込み、出力するにはどうしたらいいでしょうか。 わかる方いらっしゃいましたら教えてください。 お願い致します。 #include<stdio.h> #include <stdlib.h> #include <time.h> #define max 3000000 #define nrand(n) (int)((double)n*rand()/RAND_MAX) /* 0以上n未満の整数を返す */ int main() {   FILE *Wf;   char W_filename[20];   int *W=(int *)malloc(sizeof(int) * max);   printf("入力ファイル名 : "); scanf("%s",W_filename);   if( ( Wf=fopen(W_filename,"w") ) == NULL ) printf("ファイルを開けません\n");   else   {     for(i=0;i<max;i++)     {     W[i]=nrand(2);     fprintf(Wf,"%d ",W[i]);    }   }   fclose(Wf);   free(W); } 出力が ‰‱‱‰‱‱‰‱‱‰‰‰‰‱‰‱‰‱‰‰ のようになってしまいます。 Wにはちゃんと0か1が入っているみたいなのですが・・・