プログラムが動かない!プログラムの修正方法とは?

このQ&Aのポイント
  • 以前動いていたプログラムが動かなくなりました。プログラムは3個のtxtファイルで第1列の絶対値和、第2列の絶対値和を求め、1つのtxtファイルに出力するものです。
  • プログラムの修正方法は、ファイルの読み込みと計算部分で問題が生じている可能性があります。問題のある箇所を特定し、適切な修正を行う必要があります。
  • メイン関数には問題はないようですが、関数`read_data`と`ecg_rr`の実装が正しく動作していない可能性があります。これらの関数を確認し、修正することでプログラムが正常に動くようになるでしょう。
回答を見る
  • ベストアンサー

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

以前動いていたプログラムが動かなくなりました。 プログラムは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); } } メイン関数には問題がないので省略しましたが、ここまでで問題というところはあるでしょうか?

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

  • ベストアンサー
  • a987654
  • ベストアンサー率26% (112/415)
回答No.2

>以前動いていた これは、”プログラムには問題ありません。”と貴方が自らおっしゃっているのです。 それなのになぜ、プログラムを示すのでしょうか? その状態で、プログラムを解読してくださる、きとくな方もおられるかも、 知れませんが、少なくとも私はプログラムを見る気は起こりません。 問題解決のヒントだけお答えします。 1.動いていたプログラムには問題は無い 2.起動方法、引数の与え方に問題は無いのでしょうか? 3.ファイルのデータに問題は無いのでしょうか?(改行、復帰のコード) 4.データの中に全角空白が混じっている 5.万が一プログラム側の問題を疑うのであれば   プログラムの要所々々にprintfを入れてご自分で動作を   確認することです。

kenkenkenken25
質問者

お礼

ご指導、ありがとうございます!こういった掲示板を利用するのは初めてなので、どういう風に利用すれば良いかまだわかっていないところがありました。マナー違反になっているとご指摘され、反省しています。 ただ、どういう風に質問をすればよいのか、わからず課過去の書き込みなどを参考にしました。 課題の丸投げは勿論駄目だと思っていたので、自分で作ったものを掲載するのが良いと私自身は判断したのですが・・・。確かに以前は動いていたプログラムを掲載するのは意味がありませんでした。 これから質問をする際は気をつけていこうと思います。 ありがとうございました。

その他の回答 (1)

  • a987654
  • ベストアンサー率26% (112/415)
回答No.1

マナー違反に抵触しますよ。 何が問題で何をしたいのか、はっきり書きましょう。

kenkenkenken25
質問者

お礼

メイン関数は以下の通りです。 /*****************メイン関数*******************/ void main(argc,argv) int argc; char *argv[]; { int data_max; FILE *fp1,*fp2; if(argc!=3){ printf("ar data\n"); exit(0); } if((fp1=fopen(argv[1],"r")) == NULL){ printf("Can't open the file\n"); exit(2); } if((fp2=fopen(argv[2],"w"))==NULL){ printf("Can't create the output file of ECG_RR\n"); exit(3); } data_max=read_data(fp1); printf("%d\n",data_max); fclose(fp1); ecg_rr(fp2,data_max); fclose(fp2); }

kenkenkenken25
質問者

補足

言葉足らずで申し訳ありません。僕の作ったプログラムでは例えば k1.txt(中身は以下の通り) 4 2 -2 1 3 -4 1 -5 k2.txt(中身は以下の通り) 2 3 1 9 -4 -2 1 -6 といった2列のデータを読み込ませ、k1.txtにおける第一列の絶対値和ここでは10、第二列の絶対値和12、k2.txtにおける第一列の絶対値和8、第二列の絶対値和20をsum.txtに 10 12 8 20 といった形で出力していくというプログラムです。 以前は私のプログラムで結果のテキストファイルが出力されていたのですが、先日実行したところテキストファイルが出力されませんでした。 本当に申し訳ありませんでした。よろしくお願いします。

関連するQ&A

  • プログラムが間違っているようなのですが

    ファイルからデータを読み込み、そのファイル内のデータの最大値・最小値を求めるプログラムを作ろうとしているのですが、実行結果が 最大値:0 最小値:0 となり、max2とmin2にうまく値が入っていないようなのです。 main関数にsub_main;を追記してみたりと色々試しているのですが、うまくいきません。 ファイルの読み込みがうまくいっていないのでしょうか。 もしくはポインタの使い方がまずいのでしょうか。 ファイルの内容は 20 40 30 ・ ・ ・ という感じの、不規則な数字の羅列で、今は10個入っています(データ個数が分からない場合も考えているのですが・・・)。 プログラム初心者なので難しいことはあまり分からないですが、助言を頂ければ嬉しいです。 #include<stdio.h> int sub_main(int *tensu,int *max,int *min) { int i=0; FILE *fp; fp = fopen("11.txt","r"); while(fscanf(fp,"%d",&*tensu)!=EOF); { for(i=0;i<10;i++) { if(*tensu+i>*max) *max=*tensu+i; if(*tensu+i<*min) *min=*tensu+i; } } fclose(fp); } main() { int max2=0,min2=0; int *max=&max2; int *min=&min2; printf("最大値:%d\n最小値:%d\n",max2,min2); }

  • 複数ファイルの出力

    質問があります。1600個のデータを読み込んで(16個ずつの組で100組)、1番目、3番目、5番目、7番目のデータをss[1].txtとして出力し、同様に2番目、4番目、6番目、8番目のデータをsk[1].txt、9番目、11番目、13番目、15番目のデータをks[1].txt、10番目、12番目、14番目、16番目のデータをkk[1].txtとして出力させます。以下、ss[2].txt,sk[2].txt,ks[2].txt,kk[2].txt・・・に関してはそれぞれ直前のファイルに16を足したデータ(例えばss[2].txtなら、17番目、19番目、21番目、23番目のデータを出力)を出力させるというプログラムです。 以下に自分で作ったプログラムを掲載します。 void ecg_rr(fp,data_max) FILE *fp; { int i,j=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i,j=0;i<100,j<100;i++,j++) { sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0+j*16]); fprintf(fp,"%8.8f\n",data[0][2+j*16]); fprintf(fp,"%8.8f\n",data[0][4+j*16]); fprintf(fp,"%8.8f\n",data[0][6+j*16]); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1+j*16]); fprintf(fp,"%8.8f\n",data[0][3+j*16]); fprintf(fp,"%8.8f\n",data[0][5+j*16]); fprintf(fp,"%8.8f\n",data[0][9+j*16]); fclose(fp); /*ks,kkに関しても同様*/ } } これだと100個ずつファイルを出力できるのですが、データが全て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] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • C言語のファイル操作についての質問です

    #include <stdio.h> #include<process.h> int main(void) { FILE *fp; int a[200], i, j, cnt, max, max_i; fp = fopen("data.txt", "r"); if (fp == NULL) { printf("file cannot open.\n"); exit(1); } for(i = 0; i < 200 && fscanf(fp, "%d", &a[i]) == 1; ++ i) ; fclose(fp); for(max = max_i = j = 0; j < i; ++ j){ int k; for(cnt = 0, k = j + 1; k < i; ++ k) cnt += (a[j] == a[k]); if(cnt > max) max = cnt; max_i = j; } printf("%d\n", a[max_i]); return 0; } これは「data.txt」というファイルから最頻値を探し出し、その値を表示するプログラムです。 しかし、このプログラムだと最頻値が1つしか表示できないので、 最頻値が複数ある場合でも、すべての最頻値の値を表示させるようなプログラムに書き換えてほしいです。 よろしくお願いします。 例)data.txt 30000 100 150 30000 30000 100 4320 100 出力↓ 30000 100

  • 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行目から読み込むように設定したいのですが、やり方がよく分かりません。 どのようにプログラムを書き換えれば良いか、教えていただけると助かります。 よろしくお願いします。

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

    どこが間違っているのかわかる方お願いします ・行列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

  • プログラムの異常終了

    TEST2とコマンドプロンプトに表示された後、異常終了します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char **f_name2){ printf("ファイル名を入力"); scanf("%s",*f_name2); } int count_num(FILE *fp){ int ch =0; int count=0; while((ch=fgetc(fp))!=EOF){ if(ch>0&&ch<9){ count++; } } return(count); } int main (void){ char *fname; FILE *fp; get_name(&fname); if((fp=fopen(fname,"r"))==NULL){ printf("ファイルオープンエラー"); }else{ printf("%d\n",count_num(fp)); } fclose(fp); printf("TEST2\n"); return(0); } textc13-7.exeは動作を停止しました。と表示があります。正常に終了したいので、 御指摘お願いします。

  • どうしてもわかりません2

    #include <stdio.h> #include <string.h> #define MAX_LINE_SIZE 1024 #define NN 1000000 main(int argc, char* argv[]) { char fname[256]; char buf[MAX_LINE_SIZE]; int i; FILE *fp; for(i=1; i<argc; i++) { bzero(fname, 256); strcpy(fname, argv[i]); if( !(fp = fopen(fname, "r"))) { printf("File Open Error.\n"); exit(1); } while( fgets(buf, MAX_LINE_SIZE, fp ) ) { printf("%s", buf); } fclose(fp); } } このプログラムをコンパイルして(実行形式はa.out)コマンドラインから 以下のようなデータのテキストファイルna.txtを実行しました。./a.out na.txtするとこのソースだとbufに一行目がすべて文字列として入ってしまうと思います。そうではなく、1行目の数字ひとつずつを取り出す方法が知りたいです。たしか数字とか空白とかを判定する関数があったともうのですが、どうしてもわかりません。 ちなみにこの問いかけからこの問いがきています。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1577294 1 2 3 4 5 6 2 3 4 5

  • 大量のファイルを読み込み、その各ファイルの中の最大値と最小値の出力の仕方

    各ファイルの名前はinput_0.txtからinput_4.txtまであるとします。これらのファイルには(1)ナンバー(2)身長(3)体重がスペースをはさんで入力されています。 例:input_0.txt 1 172.3 65.3 2 164.3 54.6 3 176.4 55.4 4 170.2 70.4 5 167.4 63.8 この例では3番目の176.4が最大値として認識し2番目の164.3を最小値として出力させたいのですが、うまくいきません。プログラムを以下のように作りました。どこがいけないでしょうか?ご教授の方よろしくお願いします。 FILE *fpr,*fpw; int no[N],i,j,max_j,min_j; char fname[30]; float height[N],weight[N],max=0,min=0; for(i=0;i<4;i++) //file題名用ループ { sprintf(fname,"input_%d.txt",i); if((fpr=fopen(fname,"r"))==NULL) {puts("file open error!!");return 0;} for(j=0;j<5;j++){ //ファイル内容用ループ while((fscanf(fpr,"%d%f%f",&no[j],&height[j],&weight[j]))!=EOF) if(height[j]>max){ max=height[j];max_j=j; printf("number=%d__height=%.2f__weight=%.2f\n",no[max_j],max,weight[max_j]); } if(height[j]<min){ min=height[j];min_j=j;} printf("number=%d__height=%.2f__weight=%.2f\n",no[min_j],min,weight[min_j]); } fclose(fpr); }

  • 同時にファイル読み込み 書き込み

    現在、ヒストグラムのプログラムを作成しています。 まず0~255の1000個の乱数ファイルdata.txtを読み込み、 ヒストグラムは出来たのですが、 エクセルでグラフを作りたいので、 data1.txtに書き込みたいので、下のソースでやってみましたが、 0~255のカウントが全部0になってしまします。 fp = fopen("data1.txt","w");が無ければ正常に処理されます。 どうか教えてください。よろしくお願いします。 #include <stdio.h> #define BUF 10 #define MAX 256 void count(FILE *fp , int* counter); int main(void) { FILE *fp; fp = fopen("data.txt","r"); fp = fopen("data1.txt","w"); int counter[MAX]; int i; for(i=0 ; i<MAX ; i++) { counter[i] = 0; } count(fp , counter); for(i=0 ; i<MAX ; i++) { printf("%d %d\n" , i, counter[i]); } fclose(fp); return 0; } void count(FILE* p_file , int* counter) { char buf[BUF]; while (fgets(buf , BUF , p_file) != NULL) { int n; sscanf(buf , "%d" , &n); counter[n]++; } }