• ベストアンサー

fscanf Segmentation fault

すいません。Segmentation faultがでてプログラムが動きません・・・原因がわからないのでわかる方がおられましたら教えてください。 FILE* Bank::setFp( const char c[]){ if(fp!=NULL){ fclose(fp); }else{ fp = fopen("c[]","r"); } return fp; } Bank::Bank(char c[]){ fp = 0; size = 0; arraySize = 0; int some = 0 ; int bal; char ac[16]; char cust[316]; fp = setFp(c); fscanf(fp, "%d:",&some); grow(arraySize+10); for(int i=1 ; i<arraySize ; i++){ fscanf(fp, "%[^,],%d,[^;];",arraySize,ac,&bal,cust); savings[i].init(cust,ac,bal); size++; fclose(fp); } } ちなみにSegmentation fault は fscanf(fp, "%d:",&some);を作動した時にでました。 ちなみにサンプルデータは、 3:423423454567987,9234617,Woo,Charles,Winnipeg,416-555-5558;523423454567987,2534,DeJesus,Pancho,Edmonton,416-555-5559;623423454567987,543876,Smith,Bob,Charlottetown,416-555-5544; です。 メインプログラムでは、Bank one("a34.dat");と読んでるだけです。 よろしくお願いします

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

いや、一番の核心をはずされても困るんですけど…… 直接のsegmentation faultの原因はこれですよ。 > ・fopenの引数が間違っておりc[]というファイルがなければファイルオープンに失敗する(fpは常にNULL) 引数で渡している"a34.dat"ではなく、"c[]"をfopen()しようとしています。

zendoko
質問者

お礼

早速・・fp=fopen(c,"r"); でやってみました・・・動きましたありがとうございます^^。

その他の回答 (2)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

fopen()の戻り値がNULLかどうか、必ずチェックしてください。

zendoko
質問者

お礼

fopen に問題があったみたいです^^;ちゃんと内容をみてみたら気づいたのかもしれませんが・・・まだプログラムになれてませんので。 ありがとうございました^^

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

class Bankの定義を出してください。 たぶんFILE *fpもそこにあるんでしょうけど。 > if(fp!=NULL){ > fclose(fp); > }else{ > fp = fopen("c[]","r"); > } ・fpがNULLでない場合、閉じるだけで処理が終了する (引数で渡されたファイルを開く処理がない) ・fopenの引数が間違っておりc[]というファイルがなければファイルオープンに失敗する(fpは常にNULL) で、NULLのfpに対してfscanf()するからsegmentation faultになるんです。 なお、質問内容とは直接関係ありませんがコンストラクタで色々処理させるのは非常に良くないコードです。 コンストラクタは初期化のみにとどめ、本処理は別のメンバ関数に持たせましょう。

zendoko
質問者

補足

早速のお返事ありがとうございます。 まずClass Bankの定義ですが・・ class Bank{ Account * savings; FILE * fp; int size; int arraySize; int grow( int s = 10); public:       : (コンストラクタがたくさんあります^^;) : FILE* setFp( const char [] ); Bank( char[] ); } if(fp!=NULL) のところをif(fp==NULL)にもしてみたり、コンストラクターを合わせてやってみたりしてもみたんですが、結果は同じでした。 ちなみにコンストラクターは決められているので・・変えることができません><。

関連するQ&A

  • segmentation fault

    ソースは以下です 途中までは実行されるんですけど,,, 教えてください #include <stdio.h> #include <stdlib.h> #include <math.h> #define M_PI 3.14159265358979 /* 円周率 */ int main(int argc, char **argv) { int xsize,ysize,depth,x,y,c; char code[10]; FILE *fp; unsigned char ***image,***outimage; double sum_kido,sum_kido_x,grad; int xmax,xmin,ymax,ymin,count; char grad_im; int sumx, sumy, N; char dummy[1024]; double Deltax; double Deltay; if(argc != 3){ fprintf(stderr,"Usage : a.out input_filename output_filename\n"); exit(1); } if((fp=fopen(argv[1],"r"))==NULL){ fprintf(stderr,"File can not open : %s\n",argv[1]); exit(1); } fscanf(fp,"%s",code); /* fscanf(fp,"%s",dummy); */ fscanf(fp,"%d %d",&xsize,&ysize); fscanf(fp,"%d ",&depth); fprintf(stderr,"%s, %d, %d, %d\n",code,xsize,ysize,depth); getchar(); image = (unsigned char ***)malloc(sizeof(unsigned char**)*ysize); for(y=0;y<ysize;y++){ image[y] = (unsigned char **)malloc(sizeof(unsigned char*)*xsize); for(x=0;x<xsize;x++){ image[y][x] = (unsigned char *)malloc(sizeof(unsigned char)*3); } } outimage = (unsigned char ***)malloc(sizeof(unsigned char**)*ysize); for(y=0;y<ysize;y++){ outimage[y] = (unsigned char **)malloc(sizeof(unsigned char*)*xsize); for(x=0;x<xsize;x++){ outimage[y][x] = (unsigned char *)malloc(sizeof(unsigned char)*3); } } // load image for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ for(c=0;c<3;c++){ image[y][x][c] = (unsigned char)(fgetc(fp)); printf("%d\n", image[y][x][c]); } } } fclose(fp); sumx = 0; sumy = 0; N = 0; for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ if((image[y][x][0]*2<image[y][x][2])&&(image[y][x][1]*2<image[y][x][2])){ outimage[y][x][0]=255; outimage[y][x][1]=0; outimage[y][x][2]=0; }else{ outimage[y][x][0]=image[y][x][0]; outimage[y][x][1]=image[y][x][1]; outimage[y][x][2]=image[y][x][2]; sumx += x; sumy += y, N += 1; } } } // output image if((fp=fopen(argv[2],"w"))==NULL){ fprintf(stderr,"File can not open : %s\n",argv[2]); exit(1); } fprintf(fp,"%s\n",code); fprintf(fp,"%d %d\n",xsize,ysize); fprintf(fp,"%d\n",depth); count = 0; for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ for(c=0;c<3;c++){ fputc(outimage[y][x][c],fp); } } } fclose(fp); fprintf(stdout, "%d, %d, %d, Gravity (x,y) = (%lf, %lf)\n",sumx,sumy,N,(double)(sumx)/(double)(N), (double)(sumy)/(double)(N)); for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ Deltax = sqrt(( pow (image[x+1][y][0] , 2.0 ) + pow (image[x+1][y][1] , 2.0 ) + pow (image[x+1][y][2] , 2.0 )) - ( sqrt( pow (image[x-1][y][0] , 2.0) + (image[x-1][y][1] , 2.0) + (image[x-1][y][2] , 2.0)))); Deltay = sqrt(( pow (image[x][y+1][0] , 2.0 ) + pow (image[x][y+1][1] , 2.0 ) + pow (image[x][y+1][2] , 2.0 )) - ( sqrt( pow (image[x][y-1][0] , 2.0) + (image[x][y-1][1] , 2.0) + (image[x][y-1][2] , 2.0)))); } } for(y=0;y<ysize;y++){ for(x=0;x<xsize;x++){ double T = atan( Deltax / Deltay ); //勾配ベクトルの方向 double U = sqrt( pow ( Deltax , 2.0 ) + pow (Deltay , 2.0 ) ); //勾配ベクトルの勾配量  double V = atan( ( x - (double)(sumx) / (double)(N) ) / ( y - (double)(sumy) / (double)(N) ) ); printf(" %f\n " , V - ( T + ( M_PI / 2 ))); } } }

  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }

  • Segmentation fault

    Cygwinにてアルゴリズムの勉強のためにC言語で コーディングしているのですが、Segmentation fault (core dumped) という言葉が出てファイルを実行できません。 試行錯誤しているのですが手に負えません。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define MAX_LINE 30 int main(void); int main(void){ char buffer[3]; int taro,hanako,number; int judge[4][4] = {{3,1,2,2,},            {2,3,1,2,},             {1,2,3,2,},             {1,1,1,3,},                 }; char kekka[3][MAX_LINE] = {"太郎の勝ち", "花子の勝ち", "あいこ" }; gets(buffer); taro = atoi(buffer); taro = taro-1; gets(buffer); hanako = atoi(buffer); hanako = hanako-1; number = judge[taro][hanako]; printf("じゃんけんの結果は%sです。",kekka[number][MAX_LINE]); return(0); }

  • Segmentation fault

    私、生物系の大学院生ですが研究に進化の概念を取り込みたいと思い、Ubuntu10.04にc言語で書かれたであろうソフト(adaptsite-dといい、ある大学で無料配布されているものです。)をインストールしている最中です。インストールが成功したと思い、いざソフトを起動させてみるとSegmentation faultというエラーが出ます。 パソコンは全くの素人であるため問題を解決できないでいます。 どなたかお力をお貸しいただけないでしょうか。 手順は以下のようなものです。 ダウンロード後にREADMEを読んでみたところ以下のMakefileを用いてインストールするようでしたので、 Makefile ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CC = cc all : adaptsite-d OBJECTS = adaptsite-d.1.o adaptsite-d.2.o adaptsite-d : $(OBJECTS) $(CC) -o adaptsite-d adaptsite-d.1.o adaptsite-d.2.o adaptsite-d.1.o : adaptsite-d.h adaptsite-d.1.c $(CC) adaptsite-d.1.c -lm -c adaptsite-d.2.o : adaptsite-d.h adaptsite-d.2.c $(CC) adaptsite-d.2.c -lm -c ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ターミナルで $make としました。インストールが完了したと思い、このソフトをterminalから起動させると Segmentation fault Segmentation fault とSegmentation faultという文が2回表示されます。 そこで、このSegmentation faultという文をgoogleで検索してみると、あるサイト(http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=48299&forum=10)に行き着きました。内容は理解できませんでしたが、上のSegmentation faultの原因を特定する方法が書いてあることは理解できたため、 Makefikeを以下のように書き換え(-Wall -O2 を追加)、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CC = cc all : adaptsite-d OBJECTS = adaptsite-d.1.o adaptsite-d.2.o adaptsite-d : $(OBJECTS) $(CC) -Wall -O2 -o adaptsite-d adaptsite-d.1.o adaptsite-d.2.o adaptsite-d.1.o : adaptsite-d.h adaptsite-d.1.c $(CC) -Wall -O2 adaptsite-d.1.c -lm -c adaptsite-d.2.o : adaptsite-d.h adaptsite-d.2.c $(CC) -Wall -O2 adaptsite-d.2.c -lm -c ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ terminalで $make とすると、 adaptsite-d.1.c: In function ‘main’: adaptsite-d.1.c:30: warning: ‘brlen1’ may be used uninitialized in this function adaptsite-d.1.c:30: warning: ‘brlen2’ may be used uninitialized in this function cc -Wall -O2 adaptsite-d.2.c -lm -c adaptsite-d.2.c: In function ‘funccod’: adaptsite-d.2.c:32: warning: ‘aab’ may be used uninitialized in this function cc -Wall -O2 -o adaptsite-d adaptsite-d.1.o adaptsite-d.2.o といったエラーメッセージが表示されました。 おそらく、adaptsite-d.2.cの文中のbrlen1とbrlen2、adaptsite-d.2.cの文中のaabという関数?を初期化すればいいというメッセージだと思うのですが、どこに何を書き足せばいいのか全く検討がつきません。 どなたか解決策を教えていただけませんか。よろしくお願いします。

  • C言語 Segmentation fault

    program SPROGRAM 17 4 pas104 SIDENTIFIER 43 4 ( SLPAREN 33 4 上記のようなファイルを読みこんで、1行づつ各トークン(programとか17とか)を構造体に格納する関数reader()を作りましたが、これを以下のparser.cで呼びだすと「Segmentation fault(core dumped)」となってしまいます。gdbのrunコマンドでプログラムを実行すると、関数を呼び出す所で Program received signal SIGSEGV, Segmentation fault. 0x0040140f in reader () と表示されました。が,どうすればよいか全然分かりません・・・ どうすれば正しく動作してくれるのか、どなたか教えてください・・・ 以下ソース /*read.c*/ #include "head.h" void reader(void) { fprintf(stdout,"check"); char buf[BUF_LEN]; if (fgets(buf,sizeof(buf),fp) == NULL)/*ここで1行読みこむ*/ {/*いきなりNULLの場合*/ strcpy(t.str, ""); t.num = SEOF; t.line = 1; } else { 省略 } return; } /*parser.c*/ #include "head.h" struct tokenbox t; FILE *fp; int main(int argc, char *argv[]) { if (argc != 2)/*引数チェック*/ { fprintf(stderr,"Usage: (./parser) (file.ts)\n"); return -1; } int len; len = strlen(argv[1]);/*file.ts の長さ取得*/ if((argv[1][len-1] == 's') && (argv[1][len-2] =='t') && (argv[1][len-3] == '.'))/*tsファイルが指定されているかどうか*/ { fp = fopen(argv[1],"r");/*ファイルオープン*/ if (fp == NULL) { fprintf(stderr,"Such ts file is not exist\n"); return -1; } fprintf(stdout,"authenticate ts file!\n");//←これは出力される reader(); //←ここでSegmentation faultと思われる printf("t.str = %s\n", t.str); printf("t.str[0] = %c\n", t.str[0]); printf("t.num = %d\n", t.num); printf("t.line = %d\n", t.line); fclose(fp); return 0; } else { fprintf(stderr,"the file is not ts\n"); return -1; } } ヘッダファイル一部抜粋 /*head.h*/ #include <stdio.h> #include <string.h> #include <stdbool.h> #define BUF_LEN 128 #define TOKEN_LEN 128 struct tokenbox {/*tsファイルの各情報を格納する構造体*/ char str[TOKEN_LEN]; int num; int line; }; extern struct tokenbox t;/*構造体をtと置く*/ extern FILE *fp; /*ファイルポインタ*/

  • printfでSegmentation fault

    gccでプログラムを作っています。 分割コンパイルを試していたのですが、 printf("a"); なら正常なのに、 i=1; printf("%d",i); とするとSegmentation faultになります。 printf("%f",0.1); とかも無理です。 分かる方がいらっしゃいましたらお願いします。

  • fscanf

    fscanfを使って、ファイル(普通の英文が入っています)から一単語ずつ読み込んでいきたいと思っているのですが、どうすれば良いのかわかりません。 int main(int argc,char *argv[]){ FILE *fp; char *word; fp = fopen(argv[1], "r"); if(fp == NULL){ printf("error: not open file.\n"); return(0) ;} while( ){ fscanf(fp,"%[a-zA-Z]",word); printf("%s\n", word); fflush(stdout); } fclose(fp); return 0; } とりあえず上の様なプログラムで、一単語ずつ順番に単語を出力できるようにしたいと思っているのですが。 いろいろ変なところなど在ると思いますが、whileの条件など、どうすればよいか教えてください。

  • fscanf関数について

    -------------------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE*fp; int ch,dt; char ss[80]; if((fp=fopen("bbb.txt","w"))==NULL){ printf("出力ファイルをオープンできません.\n"); exit(1); } fprintf(fp,"%c",'A'); fprintf(fp,"%s\n","abcdeABCDE"); fprintf(fp,"%d\n",1234); fclose(fp); if((fp=fopen("bbb.txt","r"))==NULL){ printf("入力ファイルをオープンできません.\n"); exit(1); } ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); fscanf(fp,"%d",&dt); printf("dt=%d\n",dt); fclose(fp); return 0; } -------------------------------------------------- 以上のプログラムで、プログラムの通り「bbb.txt」は、 AabcdeABCDE 1234 となっております。 そこで疑問なのですが、「ch=fgetc(fp);」は1文字読み込みなので、'A'だけと分かるのですが、「fscanf(fp,"%s",ss);」はfpからの読み込みで何故、 AabcdeABCDE 1234 の全部を読み込まず、'A'を抜かした、「abcdeABCDE」だけを読み込んでくれるのか? 後、「fscanf(fp,"%d",&dt);」は何故「AabcdeABCDE」を抜かした、「1234」だけを読み込んでくれるのかが分かりません。 「fscanf(fp,"%d",&dt);」については数値だけを読み込んでくれるのかと思い、 ch=fgetc(fp); printf("ch=%c\n",ch); fscanf(fp,"%s",ss); printf("ss=%s\n",ss); の部分を無くせば、「1234」だけを読み込んでくれるのかと思ったのですが、数値は正しく表示されません。 以上教えていただければ嬉しいです。

  • fscanfについて

    ファイルの中身が例えば 600 0.6 3.5 となっているとき, fscanfで読み込むと改行\nを読み込んでくれる場合と読み込まない場合がありませんか? また,これだったら,経験から fscanf(fp,"%d",&a); fscanf(fp,"%f",&b); fscanf(fp,"%c",&c); // \nの読み飛ばし fscanf(fp,"%f",&d); fscanf(fp,"%c",&e); // \nの読み飛ばし でやるとできそうですが,fscanf(fp,"%d",&a);のあとの\nの読み飛ばしがいらないのは何故ですか?

  • fscanfの使い方

     現在C言語の勉強をしているのですが、ファイル入力のfscanfの使い方がいまいちわかりません。  テキストファイル「TEST4K01.txt」には 「A01MATSUMOTO 090075100」が入ってるのですが、それぞれ構造体に直接振り分けて格納したい為fscan関数を使って下のソースを書いたのですがコンパイルするといつも以上終了してしまいます。大変申し訳ないのですが、誰か助言を御願いします。 #include<stdio.h> #include<stdlib.h> struct score { char clas_i; char num_i; char name[10]; int eigo_i; int sugaku_i; int kokugo_i; }; FILE *ifp; int main(void) { struct score dt; if((ifp = fopen("TEST4K01.txt", "r")) == NULL){ printf("ファイルエラー\n"); exit(1); } fscanf(ifp, "%1c%2d%10c%3d%3d%3d\n", &dt.clas_i, &dt.num_i, &dt.name, &dt.eigo_i, &dt.sugaku_i, &dt.kokugo_i); printf("%s", dt.clas_i); printf("%d", dt.num_i); printf("%s", dt.name); printf("%d", dt.eigo_i); printf("%d", dt.sugaku_i); printf("%d", dt.kokugo_i); fclose(ifp); return 0; }