• 締切済み

このプログラムの内容を知りたいのですが…

/*ファイルの書き込み*/ void kyoku_write(char *file_name){ int i=0, j; FILE *write; FILE *point; write = fopen(file_name, "w"); for(j = 1; j < ONPU; j++) { fprintf(write, "%d,",kyoku[i][j]); } point = fopen("メロディ点数.txt","a"); switch(m_key){ case 1: fprintf(point,"【%d】C ***%d\n",scale,kyoku[i][0]);break; case 2: fprintf(point,"【%d】CM7 ***%d\n",scale,kyoku[i][0]);break; } for(j = 2; j < ONPU; j++) { if(kyoku[i][j] == 14 || kyoku[i][j] == 15 || kyoku[i][j] == 16) fprintf(point,"◆"); else if(kyoku[i][j] == 0) fprintf(point,"○"); else fprintf(point, "%d,",kyoku[i][j]); } fprintf(point,"\n///////////////////////////////////////////////////////////////////////////////\n"); fputs("\n", write); fclose(write); fclose(point); } このプログラムが理解できません。わかる方がいたら教えてください。お願いします。

みんなの回答

  • keikan
  • ベストアンサー率42% (75/176)
回答No.4

#3です。訂正^^;; /*この関数に渡されたファイル名のファイルに"\n"を上書きする。(どこかで処理の状況を監視しているのだろうか)*/ fputs("\n", write); のところ、最初の方でkyoku[0][j]を全部書き込んでましたね^^;; でもって、最後に改行してるみたいです。

  • keikan
  • ベストアンサー率42% (75/176)
回答No.3

/*ファイルの書き込み*/ void kyoku_write(char *file_name){ int i=0, j; FILE *write; FILE *point; /* file_nameというファイルに、 定義してあるグローバルなONPUという数の、 きっとどこかで定義してあるグローバルなkyoku[0][j]の値を書き込む */ write = fopen(file_name, "w"); for(j = 1; j < ONPU; j++) { fprintf(write, "%d,",kyoku[i][j]); } /*メロディ点数.txtというファイルを追加モードで開く*/ point = fopen("メロディ点数.txt","a"); /*きっとどこかで定義してあるグローバルなm_keyの値が1なら きっとどこかで定義してあるグローバルなscaleという値と"C ***"と、kyoku[0][0]の値をメロディ点数.txt書き込む*/ /*きっとどこかで定義してあるグローバルなm_keyの値が2なら きっとどこかで定義してあるグローバルなscaleという値と"CM7 ***"と、kyoku[0][0]のメロディ点数.txt値を書き込む*/ switch(m_key){ case 1: fprintf(point,"【%d】C ***%d\n",scale,kyoku[i][0]);break; case 2: fprintf(point,"【%d】CM7 ***%d\n",scale,kyoku[i][0]);break; } /*jが2からONPUまでの値において きっとどこかで定義してあるグローバルなkyoku[0][j]が14,15,16ならばメロディ点数.txtに"◆"を書き込む きっとどこかで定義してあるグローバルなkyoku[0][j]が0ならばメロディ点数.txtに"○"を書き込む きっとどこかで定義してあるグローバルなkyoku[0][j]がそれ以外ならばきっとどこかで定義してあるグローバルなkyoku[0][j]の値をメロディ点数.txt書き込む */ for(j = 2; j < ONPU; j++) { if(kyoku[i][j] == 14 || kyoku[i][j] == 15 || kyoku[i][j] == 16) fprintf(point,"◆"); else if(kyoku[i][j] == 0) fprintf(point,"○"); else fprintf(point, "%d,",kyoku[i][j]); } /*たぶんデータの区切りとしての文字列をメロディ点数.txt書き込む*/ fprintf(point,"\n///////////////////////////////////////////////////////////////////////////////\n"); /*この関数に渡されたファイル名のファイルに"\n"を上書きする。(どこかで処理の状況を監視しているのだろうか)*/ fputs("\n", write); fclose(write); fclose(point); } /*結局のところ、きっとどこかで定義してあるグローバルなkyoku[0][j]の内容に応じて メロディ点数.txtに文字及びkyoku[0][j]の内容を書き込んでいる で、書き込みが終わったことを渡されたファイル名のファイルに記している */ >このプログラムが理解できません。わかる方がいたら教えてください。お願いします。 参考程度に元のプログラムを読んでね。 ちなみにどこがどうわからないのか、明確にした方がよい。関数やら、ステートメントなどの使い方はネットでも調べられるし本もいっぱい出てる。 アルゴリズムも基本的なところはほとんど調べられるので、まず調べてみて何がどうわからないか明確にした方が、早くて的確なアドバイスがいただけるよ^^

commotion
質問者

お礼

遅くなりましたが、大変参考になりました。自分でも調べてがんばりたいと思います。ありがとうございました。

回答No.2

> ソース全体でも数百行はあるんですが載せても大丈夫ですか? それは迷惑というもの。載せたって誰も読んではくれないでしょうし、そもそも何のために載せるんです? 理解しなければいけないのは'あなた'なのに。

  • ganzou
  • ベストアンサー率29% (25/85)
回答No.1

これでわかることは、 file_nameで指定されたファイルに kyoku[0][1...ONPU] の中のデータが書き込まれる。 メロディ点数.txtというファイルの中に 【1】C ***1 ○12,14,◆11, /////////////////////////////// のようなデータが追加される。 この二つしかわかりません。 これは一部分なので、ソースの全体と、これがどこから出てきたものなのか、何をするためのものなのか、などがないと正確に答えることはできません。

commotion
質問者

補足

遺伝的アルゴリズムを使って自動作曲システムを作成しようと思っているんですが、C++初心者なのでどのプログラムを載せたらいいかわかりません。ソース全体でも数百行はあるんですが載せても大丈夫ですか?

関連するQ&A

  • C言語のプログラムに関する質問です。

    C言語初心者で困っています。 SNをサンプリング数、FNをファイル数として、テキストファイルの1行目のデータ(kari[0])と2行目のデータ(kari[1])をそれぞれCH1、CH2に読み込むような以下のようなプログラムがあります。 ------------------------------------------ //読込みファイル名の設定// for(j=1;j<FN+1;j++){ sprintf(file_name,"%s%d%s",file,j,".txt"); printf("%d%s\n",j,file_name); if ((fp = fopen(file_name, "r")) == NULL){ printf("Error: Can't open file; %s\n", file_name); } //データの読込み// for(i=0;i<SN;i++){ fscanf(fp,"%lf,%lf\n",&kari[0],&kari[1]); ch1[i]=kari[0]; ch2[i]=kari[1]; } fclose(fp);       ・       ・       ・ fclose(fp); } ---------------------------------------------- しかし、テキストファイルの初めの3行には不必要な文字列が存在するため、4行目から読み込むように設定したいのですが、やり方がよく分かりません。 どのようにプログラムを書き換えれば良いか、教えていただけると助かります。 よろしくお願いします。

  • プログラムを組んだのにエラーが出る!!!

    #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { int i, j; int m, flag, count; FILE *fp; if (NULL == (fp = fopen("prime.txt", "w"))) { printf("Cannot open output file\n"); exit(1); } count = 0; for (i = 2; i < 1000; i++) { m =sqrt(i); flag = 1; for (j = 2; j <= m; j++) { if (i % j == 0) { flag = 0; break; } count++; } if (flag) { printf("%4d ", i); fprintf(fp," %4d", i); } } printf("\n乗除回数:%d\n", count); fprintf(fp,"\n乗除回数 %d\n", count); fclose(fp); return 0; } (通常課題2-3 1000以下の正の整数値のうち,素数をすべて計算し,結果をファイルに格納するプログラムを作れ. .また、計算の実行の中で乗除を行った回数もあわせて表示し、ファイルに格納すること 実行結果 2 3 5 7 11 13 17 … 991 997 乗除回数:78022 どこが間違ってるのか指摘してください お願いします!

  • C言語でファイルを出力

    ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、 できたファイルの後に?マークがついてきます。 file = fopen("filename.txt", "w"); for(j=0; j<30; j++){ fprintf(file ,"%d.dat\n",j ); } fclose(file); file2 = fopen("filename.txt", "r"); として、ファイル名を書いたファイルをつくってから、 for(k=0; k<30; k++){ fgets(fp,sizeof(fp),file2); file_out = fopen(fp,"w"); 省略 fprintf(file_out, %e %e \n",a ,b); fclose(file_out); } fclose(file2); をして、30個のファイルを出力すると、 0.dat? 1.dat? 2.dat? . . . 29.dat? というファイルができてしまいます。 ファイルの中はしっかりできています。 なにか解決法を知っている方がおりましたら、どうか教えて下さい。

  • phpで二重書込みできないプログラムを作りたい

    PHP初心者です。 テキストファイルに、ある文字列を書き込むプログラムを作ろうとしています。 ファイル内容に同じ文字列があれば書き込まず、 同じ文字列が無ければファイルに書き込むという プログラムを作りたいのですが、 うまくいきません。 どなたかアドバイスをお願いします。 <?php $name = "文字列"; $fp = @fopen("file.txt", "r"); $contents = @file_get_contents($fp); if(ereg($name, $contents)) { print "登録済みです。" ; } else { $fpa = @fopen("file.txt", "a"); fputs($fpa, "$name\n"); fclose($fpa); print "登録しました。"; } fclose($fp); ?>

    • 締切済み
    • PHP
  • ポインタ配列をfscanfで読み込むと・・・

    現在BorlandのC言語で人の名前をセーブする処理を 作っています。そこで以下の様に書いたのですが、 コンパイラでは通るのに、実行してセーブをして ロードをすると必ず強制終了させられてしまいます。 これは一体何がいけなかったのでしょうか? また、どのように書いたらキチンと動作するのでしょう? #include <stdio.h> char *name[10]; void save(void){ FILE *file; file = fopen("name.txt", "w+"); fprintf(file,"%s %s %s ", name[1], name[2], name[3]); fclose(file); } void load(void){ FILE *file; file = fopen("name.txt", "r+"); fscanf(file,"%s %s %s ", &name[1], &name[2], &name[3]); fclose(file); } int main( void ){ name[1] = "いち"; name[2] = "に"; name[3] = "さん"; while ( 1 ){ int i; printf("name[1]:%s name[2]:%s name[3]:%s \n", name[1], name[2], name[3]); puts("1:セーブ 2:ロード"); scanf("%d",&i); if ( i == 1 ) save(); else load(); } return 0; }

  • 行列の積を計算するプログラムがうまくいきません

    どこが間違っているのかわかる方お願いします ・行列A,Bはファイルから読み込む ・行列A,Bの積Cの計算には関数を用いる #include<stdio.h> #define ROW 10 #define COL 10 void MatrixProduct(int a[][COL],int b[][ROW],int c[][ROW],int n,int m ) { int i,j,k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ c[i][j]=0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } } } int main(void) { FILE *fp1,*fp2; char fname1[64],fname2[64]; int a[ROW][COL],b[ROW][COL],c[ROW][COL],n,m; int i,j,k; printf("Input file name ?"); scanf("%s",fname1); printf("Output file name ?"); scanf("%s",fname2); fp1=fopen(fname1,"r"); fp2=fopen(fname2,"w"); fscanf(fp1,"%d %d",&n,&m); MatrixProduct(a,b,c,n,m); for(i=0;i<n;i++){ for(j=0;j<n;j++){ fprintf(fp2,"%3d",c[i][j]); } fprintf(fp2,"\n"); } fclose(fp1); fclose(fp2); return(0); } fp1 3 4 1 2 3 4 2 3 4 5 3 4 5 6 1 2 3 2 3 4 3 4 5 4 5 6

  • 画像処理プログラム

    プログラムどう改良していいか全然わかりません 教えてください Sobel フィルタは垂直成分しか見ていないため、エッジ検出としては不十分である。任 意方向のエッジを検出するためには、図4 のような垂直方向と水平方向のオペレータを用いて各成分を抽出し、それらを合成する必要がある(図5 参照)。そこで、プログラムを次のように改良し、全方向のエッジに対応したプログラムにする。 <変更前> <変更後> c =1 􀀀2 􀀀1      cy=-1 -2 -1   cx=-1 0 1 0 0 0    →     0 0 0     -2 0 2 1 2 1          1 2 1     -1 0 1 畳み込み演算     畳み込み演算 L = c・img   →  Ly = cy・img, Lx = cx・img エッジの強さ     エッジの強さ |L|        → |L|=√Lx^2+Ly^2 /** Sobel.c **/ #include <stdio.h> #include <stdlib.h> #define V_width 320 #define V_height 240 #define amp 1.0 int d[9]; int i, j, dat; float L; unsigned char img [V_height][V_width]; /* input image */ unsigned char work[V_height][V_width]={0}; /* work space */ /******* filter coefficients *******/ static int c[9] = {-1, -2, -1, 0, 0, 0, 1, 2, 1}; /*************************************/ int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char data; char str[256]; int width, height; /* check arg number */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* open input file */ if ((fpi = fopen(argv[1], "rb")) == NULL) { fprintf(stderr, "input file open error!\n"); exit(1); } /* open output file */ if ((fpo = fopen(argv[2], "wb")) == NULL) { fprintf(stderr, "output file open error!\n"); exit(1); } /* read PGM header */ while(1){ fgets(str, 256, fpi); if(str[0] == '#'){ fprintf( stderr, "%s", str); } else if( !strncmp( str, "P5", 2)){ fprintf( stderr, "This file is a PGM file.\n"); } else if( !strncmp( str, "255", 3)){ fprintf( stderr, "The file is opened.\n"); break; } else{ sscanf( str, "%d %d", &width, &height); fprintf( stderr, "SIZE: %3d x %3d\n", width, height); } } /* read data */ for (i=0; i<height; i++) { for (j=0; j<width; j++) { fread( &data, 1, 1, fpi); img[i][j] = data; } } /* image processing */ for (i=1; i < height-1; i++) { for (j=1; j < width-1; j++) { d[0]=img[i-1][j-1]; d[1]=img[i-1][j]; d[2]=img[i-1][j+1]; d[3]=img[i][j-1]; d[4]=img[i][j]; d[5]=img[i][j+1]; d[6]=img[i+1][j-1]; d[7]=img[i+1][j]; d[8]=img[i+1][j+1]; L = (float)(c[0]*d[0] + c[1]*d[1] + c[2]*d[2] + c[3]*d[3] + c[4]*d[4] + c[5]*d[5] + c[6]*d[6] + c[7]*d[7] + c[8]*d[8]); L = amp*L; dat = (int)(L); if (dat < 0) dat = -dat; if (dat > 255) dat = 255; work[i][j] = (unsigned char)dat; } } /* write data */ fprintf(fpo,"P5\n %d %d\n 255\n", width, height); for (i= 0; i<height; i++) { for (j= 0; j<width; j++) { fwrite( &work[i][j], 1, 1, fpo); } } fclose(fpi); fclose(fpo); return 0; }

  • ファイル

    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; } ビルドもできません。

  • プログラムのことについてご質問します。

    プログラムのことについてご質問します。 先日から以下のプログラムのことについて悩んでいます。 #include<stdio.h> #include<math.h> int main(int argc,char *argv[]){ FILE *rfp; FILE *wfp; int nline = 0; double score[100]; double sum_score = 0; char name[100][256]; int i; double heikinn; double hensati[100]; double ga[100]; double g[100]; double gg=0; double d=0; if (argc != 3){ fprintf(stderr,"使い方:%s 入力ファイル 出力ファイル\n",argv[0]); return -1; } if ((rfp=fopen(argv[1],"r")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[1]); return -1; } if ((wfp=fopen(argv[1],"w")) ==NULL){ fprintf(stderr,"%sが開けません\n",argv[2]); return -1; } while(fscanf(rfp,"%[^,],%lf\n", name[nline], &score[nline]) >0){ sum_score += score[nline]; nline ++; } heikinn=sum_score/nline; for (i=0; i<=nline; i++){ ga[i]=(score[i]-heikinn); g[i] = ga[i]*ga[i]; gg += g[i]; } for (i=0; i<=nline; i++){ d= gg/(nline-1); hensati[i]=10*ga[i]/sqrt(d)+50; } for(i=0; i<=nline; i++){ fprintf(wfp,"Average score is %s, %5.2lf,%5.2lf.\n",name[i],&score[i],hensati[i]); } fclose(wfp); fclose(rfp); return 0; } エラーは、出ないのですがプログラムが完了できません。 皆様のお力をおかりできないでしょうか? よろしくお願いします。

  • プログラムが動きません。

    以前動いていたプログラムが動かなくなりました。 プログラムは3個のtxtファイル(2×2のデータ)で第1列の絶対値和、第2列の絶対値和を求め、1つのtxtファイルとして出力するものです。 #include <stdio.h> #define DATA_MAX 4 #define CH 2 static double data[CH][DATA_MAX]; int read_data(fp) FILE *fp;{ int i,j=0; while(1){ for(j=0;j<DATA_MAX;j++){ for(i=0;i<CH;i++){ fscanf(fp,"%lf",&data[i][j]); } if(feof(fp)!=0) break; } return j; } } void ecg_rr(fp,data_max) FILE *fp; { int i=0; char fname[64]; char fname1[64]; for(i=0;i<3;i++) { sprintf(fname1,"k%d.txt",i+1); fp = fopen(fname1,"r"); read_data(fp); fclose(fp); sprintf(fname,"sum.txt"); fp = fopen(fname,"a"); if(data[0][0]<0){data[0][0]=-data[0][0];} else{data[0][0]=data[0][0];} if(data[0][1]<0){data[0][1]=-data[0][1];} else{data[0][1]=data[0][1];} if(data[1][0]<0){data[1][0]=-data[1][0];} else{data[1][0]=data[1][0];} if(data[1][1]<0){data[1][1]=-data[1][1];} else{data[1][1]=data[1][1];} data[0][i]=data[0][0]+data[0][1]; data[1][i]=data[1][0]+data[1][1]; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } メイン関数には問題がないので省略しましたが、ここまでで問題というところはあるでしょうか?

専門家に質問してみよう