• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のプログラムなのですが、エラーの原因がわからずに困っています。)

C言語プログラムの実行エラーの原因と解決方法

このQ&Aのポイント
  • C言語プログラムを実行中にエラーが発生し、ファイルが開けない状況になっています。最初の1000回は問題なく実行できるが、1020回目でエラーが発生しています。
  • 原因として考えられるポイントは以下の通りです。1. ファイルの存在確認をする必要があるか 2. プログラムのメモリ管理に問題があるか 3. ファイルへの同時アクセスの問題があるか
  • 解決方法としては、以下のような対処が考えられます。1. ファイルの存在を確認した上で処理を行う 2. プログラムのメモリ管理を見直す 3. ファイルへのアクセスを排他的に行う

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

  • ベストアンサー
  • u-bot
  • ベストアンサー率58% (1736/2988)
回答No.1

fopenばかりしてfcloseしていないからです。 同時にfopenできる数は上限があります。 参考:http://soudan1.biglobe.ne.jp/qa5126169.html ---- mallocしたらfreeするのと同じくらいfopenしたらfcloseするのが鉄則

Stealth7
質問者

お礼

言われてみればそうでしたね。 ついうっかりしてました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

エラーチェックをするのはよいクセですが、エラーの発生だけでなく、原因究明のための情報を同時に出力した方がよいでしょう。 printf("Error\n"); の場所で perror(files); としておけばエラーの発生したファイル名とともに、システム標準のエラーメッセージが表示されます。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/perror.3.html
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 階層型ニューラルネットに準ニュートン法のDFPを用いて学習するプログラムをC言語で作成する

    //出力層と中間層2の結合荷重を更新 for ( i = 0; i < NUM_hh+1; i++)   {  for ( j = 0; j < NUM_o; j++) { deltaw3[i][j][ilearn+1] = (y[j] - teach[j]) * y[j] * (1.0 - y[j]) * hh[i]; w3[i][j][ilearn+1] = w3[i][j][ilearn] -0.05 * H2[i][j][ilearn] * deltaw3[i][j][ilearn]; //中間層2と中間層1の結合荷重更新 for ( i = 0; i < NUM_hh+1; i++ )  {   net_input1[j] = 0;  for ( j = 0; j < NUM_o; j++ )   { net_input1[j] += w3[i][j][ilearn] * deltaw3[i][j][ilearn];   }     net_input1[i] = net_input1[j];  } for ( i = 0; i < NUM_h+1; i++)  {  for ( j = 0; j < NUM_hh; j++)   { deltaw2[i][j][ilearn+1] = net_input1[j] * (1.0 - hh[j]) * h[i]; w2[i][j][ilearn+1] = w2[i][j][ilearn] - (0.005 * H2[i][j][ilearn] * deltaw2[i][j][ilearn] );   }  } //中間層1と入力層の結合荷重更新 for ( i = 0; i < NUM_h; i++ )  {  net_input2[j] = 0;  for ( j = 0; j < NUM_hh; j++ )   {  net_input2[j] += w2[i][j][ilearn] * deltaw2[i][j][ilearn];   }  net_input2[i] = net_input2[j];  } for ( i = 0; i < NUM_i+1; i++)  {  for ( j = 0; j < NUM_h; j++)   { deltaw1[i][j][ilearn+1] = net_input2[j] * (1.0 - h[j]) * x[i]; w1[i][j][ilearn+1] = w1[i][j][ilearn] - (0.005 * H2[i][j][ilearn] * deltaw1[i][j][ilearn] );   }  } for ( i = 0; i < NUM_h; i++) // Hの更新 //  {   for ( j = 0; j < NUM_hh; j++)   { sigma2[i][j] = w2[i][j][ilearn+1] - w2[i][j][ilearn]; gamma2[i][j] = deltaw2[i][j][ilearn+1] - deltaw2[i][j][ilearn];   }  } for ( i = 0; i < NUM_h; i++) {  for ( j = 0; j < NUM_hh; j++)   { H2[i][j][ilearn+1] = H2[i][j][ilearn] + ((sigma2[i][j] * sigma2[j][i]) / (sigma2[j][i] * gamma2[i][j])) - ((H2[i][j][ilearn]*gamma2[i][j]*gamma2[j][i]*H2[i][j][ilearn])/(gamma2[j][i]*H2[i][j][ilearn]*gamma2[i][j]));   } } プログラムの最初に戻り学習を繰り返す。 準ニュートン法(DFP)を階層型ニューラルネットに用いて学習を行うプログラムを作成しているのですが、ヘッセ行列の逆行列を更新がうまくできず、学習ができません。どこに問題があるのかわからず困っています。。 ※各層のニューロン数は、NUM_i:5 NUM_hhとNUM_h:30 NUM_o:31 w123は結合荷重、deltaw123は勾配 gamma2は勾配の差分 sigma2は結合係数の差分 学習結果を見るために関数近似を行ってます。誤差は二乗誤差を用いているのですが、結果が学習回数2回目辺りから1.#qNaN0になり、それ以降は-1.#ind00という出力になってしまいます。

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

  • scanf C言語

    現在取得したデータを多次元配列いれたいのですが、カンマまでの文字列を入れる方法がわかりません。例で言いますと jgasogasog,dklafh343,fdjalsjfd,kldjfas5 dfasfdas6ff ,fsadfa6sg,dgas6dsa,fsdafa もカンマまでの文字列array[0][0] = jgasogasog array[0][1] = dklafh34 といった形で入れていきたいです。 ご迷惑おかけしますが何卒よろしくお願いします。 途中まで作ったソースをのせます。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include<string.h> #define piyo 2 #define hoge 1400 int main(void) { FILE *fp; char test[10][500]; int n = 0; if ((fp = fopen("testfile.csv", "r")) == NULL) { printf("\aファイルをオープンできません\n"); return(0); } int i, j; int k = 0; //ファイルfpの終端指示子をチェックします。 while (!feof(fp) && k < 500) { //%cは一文字出力をしてくれる使用データ型はchar型 //fscanf関数は書式指定をしてファイルから値を読み込み、バッファに格納します。 for (i = 0; i < 10; i++) { for (j = 0; j < 500; j++) { fscanf(fp, "%[^,],%d", &test[i][j]); k++; } } } for (i = 0; i < 10; i++) { for (j = 0; j < 500; j++) { printf("test[%d][%d]=%d\n", i,j,test[i][j]); } } fclose(fp); return(0); } 似たような質問をしてすいません。

  • C言語 ファイル処理

    今、c言語のファイル処理の勉強をしているのですが。 あるファイルfp1に 106 106 106 102 177 183 123 125 105 102 101 111 というデータが入っていたとして、 このファイルfp1からこのデータを2次元配列m[i][j]に入れたいんですけど、 一応プログラム書いてみましたがうまくいきません。 for(i=0;i<3;i++){   for(j=0;j<4;j++){     fscanf(fp1,"%d",&x); /*データ読み込み*/  m[i][j]=x;     }   } for(i=0;i<3;i++){   for(j=0;j<4;j++){     printf("%d ",m[i][i]);   }   putchar('\n'); } 変数宣言部、ファイルオープン部などは省略しました。 このプログラムを実行すると。 106 106 106 106 106 106 106 106 106 106 106 106 102 102 102 102 177 177 177 177 183 183 183 183 123 123 123 123 125 125 125 125 105 105 105 105 102 102 102 102 101 101 101 101 111 111 111 111 みたいな感じで表示されます。何ででしょうか? アドバイスお願いします。

  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

  • C言語のファイル読み込み

    あるcsvファイルがあり、それは以下のように(規則性のない)波形のデータです。 0.001 0.14 0.002 0.32 0.003 0.46 ・ ・ 2.000 0.22 左側がx軸、右側がy軸で、データはそれぞれ2000個あります。 このデータ(波形)をC言語のプログラムに読み込ませるにはどうしたらいいのでしょうか? #include <stdio.h> int main(void) { double i,j; FILE *file; file = fopen("sample.csv","r"); fscanf(file,"%ls,%ls",&i,&j); fclose(file); printf("i = %d : j = %d\n",i,j); return 0; } とすれば最初の1行目だけは読めますが、それ以降がわかりません。 配列を使えばいいのでしょうか?

  • C言語のプログラミングの解答例又は修正箇所をおしえていただきたいのですが

    #include <stdio.h> int main(int argc, char **argv){ int a,b,c,g,r,i,j,ll;  int blue,green,red;  FILE *fpi,*fpo; unsigned long size,head,width,height,offset;  unsigned long comp,isize,ucolor,icolor; unsigned short plane,bitsize;  unsigned long wreso,hreso; unsigned char *image;  char infile[1024] = "t.bmp";  char outfile[1024] = "g.bmp"; long ww,hh;  long w3,h3;  unsigned char *img;  unsigned char *img2; int bai1,bai2;  bai1=1,bai2=3; fpi=fopen(infile,”rb"); for(i=0;i<2;i++){c=getc(fpi);} for(i=0,size=0;i<4;i++){size += (getc(fpi))<<(8*i);} for(i=0;i<4;i++){c=getc(fpi);} for(i=0,offset=0;i<4;i++){offset += (getc(fpi))<<(8*i);} ↑と同じようhead,width,height,plane,bitsize,comp,isize,wreso,hreso,ucolor,icolorを書く(ただしplane,bitsizeはi<2) hh=height*bai1/bai2; ww=width *bai1/bai2; img2 = (unsigned char*)malloc(sizeof(char)*3*ww*hh); for(j=0;j<hh;j++){ for(i=0;i<ww;i++){ int i1,j1,i2,j2; double x,pa,pb,pc,pd,x11,x21,x12,x22; int bb,gg,rr; i1=(i*(width-1))/(ww-1); i2=i1+1; x=(i*(width-1)*1.0)/((double)(ww-1)); pa=x-i1; pb=i2-x; j1=(j*(height-1))/(hh-1); j2=j1+1; x=(j*(height-1)*1.0)/((double)(hh-1)); pc=x-j1; pd=j2-x; x11=(double)img[j1*width*3+i1*3+0;] x21=(double)img[j1*width*3+i2*3+0]; x12=(double)img[j2*width*3+i1*3+0]; x22=(double)img[j2*width*3+i2*3+0]; bb=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd); x11=(double)img[j1*width*3+i1*3+1]; x21=(double)img[j1*width*3+i2*3+1]; x12=(double)img[j2*width*3+i1*3+1]; x22=(double)img[j2*width*3+i2*3+1]; gg=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd); x11=(double)img[j1*width*3+i1*3+2]; x21=(double)img[j1*width*3+i2*3+2]; x12=(double)img[j2*width*3+i1*3+2]; x22=(double)img[j2*width*3+i2*3+2]; rr=(((x11*pb+x21*pa)/(pa+pb))*pd+((x12*pb+x22*pa)/(pa+pb))*pc)/(pc+pd);; img2[j*ww*3+i*3+0]=(unsigned char)(bb&0xff); img2[j*ww*3+i*3+1]=(unsigned char)(gg&0xff); img2[j*ww*3+i*3+2]=(unsigned char)(rr&0xff); } } w3=ww*3; h3=hh*3; if((w3*3)%4==0){size=offset+w3*h3*3;} else{size= offset+w3*h3*3-(4-(w3*3)%4);} isize = size-offset; fpo=fopen(outfile,"wb"); putc('B', fpo); putc('M', fpo); for(i=0;i<4;i++){putc(((size>>(8*i))&0xff),fpo);} for(i=0;i<4;i++){putc(0x0,fpo);} for(i=0;i<4;i++){putc((((offset)>>(8*i)&0xff),fpo);} ↑と同じようhead,width,height,plane,bitsize,comp,isize,wreso,hreso,ucolor,icolorを書く(ただしplane,bitsizeはi<2) fwrite(&w3 ,sizeof(long),1,fpo); ↑と同じように&h,&offset,&head,&width,&height,&plane,&bitsize,&comp,&isize,&wreso,&hreso,&ucolor,&icolorを書く for(jj=0;jj<3;jj++){ for(j=hh-1;j>=0;j--){ ll=0; for(ii=0;ii<3;ii++){ for(i=0;i<ww;i++){ putc(img2[j*ww*3+i*3+0],fpo); putc(img2[j*ww*3+i*3+1],fpo); putc(img2[j*ww*3+i*3+2],fpo); ll+=3; } } ll=ll%4; if(ll!=0){for(i=0;i<(4-ll);i++)putc(0x0,fpo);} } } printf("Done\n"); fclose(fpo); printf("%s -> %s\n",infile,outfile); }

  • Cプログラムの問題

    簡単なCプログラムを作ったのですが、理解できない作動をしますので、教えて頂ければ幸いです。プログラムは int main(){ int i,j,k,n,m; double d,r; double data[300],distance[300][300]; FILE *fp; fp = fopen("data.rtf", "r"); fscanf(fp, "%d", &n); for(i=0;i<n;++i){ fscanf(fp, "%lf", &data[i]); } fclose(fp); のようなもので、data.rtfには 4 0.4 0.2 . . のようなデータが入っています。こうすると、data[0]に0.4が入ることを期待していたのですが、data[0]は0.0となり、data[1]に0.4が入りました。これはなぜなのでしょうか。

  • C言語でのFFT(構造体とポインタの使用)

    今、VC++2008 Express Editionを使用して先日、作成したFFTのプログラムを構造体とポインタを使用して書き換えました。 ビルド&コンパイルは通ったのですが、実行するとエラーが起きます。何がおかしいのでしょうか。 ソースコードを掲載しますので、教えてください。 //main.c #include <stdio.h> #include "stdlib.h" #include "fft.h" #include <math.h> #include "data.h" #define PI 3.1415926 FILE *ifp, *ofp; struct DATA f; double dT, dF; double *amp; int main (void) { //波形の生成と配列入力 for(i=0;i<1024;i++){ dumx[i]=(double)i/1024; dumy[i]=sin(2.0*PI*50*(double)i/1024); } DN=1024; //FFT用データ配列に配列のコピー time = (double*)calloc(DN,sizeof(double)); f.Re =(double*)calloc(DN,sizeof(double)); f.Im =(double*)calloc(DN,sizeof(double)); for(i=0;i<DN;i++){ time[i]=dumx[i]; f.Re[i]=dumy[i]; f.Im[i]=0.00; } //サンプリング周期 dT = time[1]; //サンプリング周波数 dF = 1.0/dT; //FFT FFT(f); //大きさを出力するための配列の確保 amp=(double*)calloc(DN,sizeof(double)); for(i=0;i<DN;i++){ amp[i]=sqrt(Sqr(f.Re[i])*Sqr(f.Im[i])); } //FFT用データ配列の初期化 free(f.Re),f.Re=NULL; free(f.Im),f.Im=NULL; //出力データの書き込み ofp=fopen("c:\\make\\data\\output.csv","w"); for(i=0;i<DN/2;i++){ fprintf(ofp,"%lf,%lf\n",i*dF, amp[i]); } fclose(ofp); return 0; } //fft.h extern void FFT(struct DATA); #define Sqr(x) ((x)*(x)) data.h int g, h, i, j, k, l, m, n, p, q, DN; double a, b, tmp; double dumx[1024]; double dumy[1024]; double *time; struct DATA { double *Re; double *Im; }; struct ROT { double *c; double *s; }; //FFT解析用ソースコード //analysis.c #include "data.h" #include <math.h> #include <stdlib.h> #define PI 3.1415926 void Table( struct ROT); void swap( double*, double*); void FFT(struct DATA in) { struct ROT r; r.c=NULL; r.s=NULL; in.Re=(double*)calloc(DN,sizeof(double)); in.Im=(double*)calloc(DN,sizeof(double)); n=DN; m = (int)(log10(n)/log10(2)); //回転因子テーブルの作成 Table(r); l=n,h=1; //バタフライ演算 for(g=1;g<=m;g++){ l/=2,k=0; for(q=1;q<=h;q++){ p=0; for(i=k;i<=l+k-1;i++){ j=i+l; a=in.Re[i]-in.Re[j], b=in.Im[i] - in.Im[j]; in.Re[i] = in.Re[i] + in.Re[j], in.Im[i] = in.Im[i] + in.Im[j]; if(p==0){ in.Re[j]=a,in.Im[j]=b; }else{ in.Re[j] = a * (r.c[p]) + b * (r.s[p]), in.Im[j] = b * (r.c[p]) - a * (r.s[p]); } p+=h; } k+=l+l; } h+=h; } j=n/2; for(i=1;i<=n-1;i++){ k=n; if(j<i){ //ビットリバース swap(&(in.Re[i]),&(in.Re[j])); swap(&(in.Im[i]),&(in.Im[j])); } k/=2; while(j>=k){ j=j-k,k /=2; //無限ループ回避(ここを消すと無限ループに陥ります。)ここから if((j==0)&&(k==0)){ break; } //ここまで } j += k; } } void Table( struct ROT w) { w.c = (double*)calloc(DN/2,sizeof(double)); w.s = (double*)calloc(DN/2,sizeof(double)); a=0.00, b = 2.0 * PI /DN; for(i=0;i<DN/2;i++) { (w.c[i])=cos(a+i*b), (w.s[i])=sin(a+i*b); } } void swap(double *var1, double *var2) { tmp = *var1, *var1=*var2, *var2=tmp; }

  • C言語プログラムについて

    wikipediaのコムソートを参考に、次のように作りました。 動きますでしょうか。動かなければ、どこをどのようにすればよいか教えていただけませんでしょうか。 プログラム「#include<stdio.h> #include<string.h> void combsort(void); void swap(void); int main(void) { combsort(); swap(); printf("データ%dの並べ替え結果は、\n%d\nです。\n"data2,data); return 0; } void combsort(){ int h,swaps,data,len,data2; printf("ソートさせる数を入力。>\n"); scanf("%d",&data); data2 = data; len = strlen(data); h = len * 10 / 13; while(true){ swapa = 0; for(i = 0;i + h <len;i++) { if(data(i) > data(i + h)) { swap(data, i, i + h); swaps +=1; } } if(h==1){ if(swaps==0){ break; } } else{ h = h * 10 / 13; } } } void swap{ int a,i,j; const int t = a[i]; a[i] = a[j]; a[j] = t; } 」 data:scanfによって入力される並べ替えを行う数値(例:0219523056810)を代入。 data2:dataのコピーで、並べ替えを行う前のデータを保管しておくもの。 また、これの反対(これが、昇順なら、降順。降順なら、昇順。)を同じようにしたいと思います。(combsort2にて)どうすればよいでしょうか。 教えていただけませんでしょうか。 お早めのご回答お待ちしております。

このQ&Aのポイント
  • 特定の端末のESETアクティベーションを解除する方法について教えてください。
  • 私はESET internet security(個人用)を使用しており、一台の廃棄予定の端末でアクティベーションが解除できなくなりました。Windows10を使用しています。
  • 使用中の別の端末から https://(Webサーバーのサーバー名、または、IPアドレス)/era/ にアクセスする方法を試しましたが、ファイアウォールの関係かアクセスできませんでした。
回答を見る

専門家に質問してみよう