• 締切済み

セグメンテーション違反

環境はLinux・C言語です。 #include<stdio.h> #include<string.h> struct book{ char author[256]; char title[256]; char publisher[256]; int year; }; int main(void); int main(void) { FILE *fp1,*fp2; struct book data[256]={0},dummy={0}; char author[256]; char title[256]; char publisher[256]; int year; int i=0,j=0; fp1=fopen("biblio.txt","r"); while(fscanf(fp1,"%s,%s,%s,%d\n",&author[0],&title[0],&publisher[0],&year)!=EOF){ strcpy(&data[i].author[0],author); strcpy(&data[i].title[0],title); strcpy(&data[i].publisher[0],publisher); data[i].year=year; i++; } j=i; fclose(fp1); while(1){ for(i=0;i<256;i++){ if(data[i].year > data[i+1].year){ dummy=data[i]; data[i]=data[i+1]; data[i+1]=dummy; break; } } if(i==256) break; } fp2=fopen("biblio2.txt","w"); for(i=0;i<j;i++){ fwrite(&data[i],sizeof(struct book),1,fp2); } fclose(fp2); return(0); } 以上のソースで、セグメンテーションエラーが出ます。 問題は while(fscanf(fp1,"%s,%s,%s,%d\n",&author[0],&title[0],&publisher[0],&year)!=EOF){ の部分だとは思うのですが、どう改善すればいいのかわかりません。 どなたかわかる方お願い致します。 ちなみに、biblio.txtの内容は B.W.Kernighan & D.M.Ritchie,The C Programming Language,Prentice Hall,1988 H.M.Deitel & P.J.Deitel,C How to Program,Prentice Hall,2001 J.R.Hanly & E.B.Koffman,Problem Solving and Program Design in C,Addison-Wesley,2002 D.M.Etter,Introduction to C,Prentice Hall,1999 H.H.Tan & T.B.D'Orazio,C Programming for Engineering and Computer Science,McGraw-Hill,2000 です。

みんなの回答

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

> while(1){ >   for(i=0;i<256;i++){ >     if(data[i].year > data[i+1].year){ >       dummy=data[i]; >       data[i]=data[i+1]; >       data[i+1]=dummy; >       break; >     } >   } >   if(i==256) break; > } これでは、i==255の時、存在しないdata[256]にアクセスしてしまいます。 バブルソートみたいですが、たぶん256のところは「j(読み込んだデータの数)-1」にするべきなのでは? > ちなみに、biblio.txtの内容は > B.W.Kernighan & D.M.Ritchie,The C Programming Language,Prentice Hall,1988 これを%sで読み込むと空白文字で途切れてしまいますが、それはかまわないのですか? 空白も読みたいなら、  fscanf(fp1,"%[^,],%[^,],%[^,],%d\n",author,title,publisher,&year) などとする方法があります。(他にも方法はあるでしょうけど。) http://homepage1.nifty.com/hujitako/yapt/SmartScanf2.htm

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

> fp1=fopen("biblio.txt","r"); fp1がNULLになっていたりしませんか?

関連するQ&A

  • ファイルについて

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1526476 先日↑で質問させてもらったものです。 #include<stdio.h> #define M 10 struct data{ char author[50]; char title[100]; char publisher[100]; int year; }book[10]; int main(void)//main関数 { FILE *fp1,*fp2; if((fp1 = fopen("biblio.txt","r")) == NULL){ printf("can't open"); } else for(i=0;i<M;i++){ fscanf(fp1,"%[^,],%[^,],%[^,],%d%d",&book[i].author,&book[i].title,&book[i].publisher,&book[i].year); fprintf(fp1,"%[^,],%[^,],%[^,],%d%d",&book[i].author,&book[i].title,&book[i].publisher,&book[i].year); } fclose(fp1); return(0); } biblio.txt(作者,タイトル,出版社,年の順に10行ファイルがあります)からファイルを読み込んで表示するプログラムを作りたいんですが、なかなかうまくいきません。。 Borlandを使ってるんですがコンパイル&実行しようとすると不正命令が出ます。 これはプログラミングが悪いんでしょうか…それとも設定が間違ってるのか… ご教授よろしくお願いします。

  • fclose()でセグメンテーション違反

    C言語でのファイル読み込みで、ファイルを開いてデータを読み込んで表示することはできたのですが、最後のfclose(fp)でセグメンテーション違反になります。一番最後のwhileループをコメントアウトしたところセグメンテーション違反にはならなかったので、ここに何か問題があると思うのですが、どこが悪いのかが分かりません... #include<stdio.h> #include<stdlib.h> main(void){ FILE *fp; int i=0 , j=0 ,cnt = 0 , c=0; char *name="data.txt"; float *buf1,*buf2; if((fp = fopen(name,"r")) == NULL){ printf("error\n"); return 0; } else{ while((c = getc(fp)) != EOF) { if(c == '\n') cnt++; } printf(">>%d<<\n",cnt+1); rewind(fp); buf1 = (float *)malloc( (int)(cnt/2) +1); buf2 = (float *)malloc( (int)(cnt/2) +1); /*ここからがおかしい?*/ while(1){ if( fscanf( fp ,"%f %f",&buf1[i],&buf2[i])==EOF )break; printf("%f %f\n",buf1[i],buf2[i]); i++; } fclose(fp); } return 0; } なぜセグメンテーション違反になっているのでしょうか?

  • C言語 シンプルソート

    C言語始めて1年の初心者です。 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 10000 void swapData(char *x, char *y); void simpleSort(char data[], int first, int last); int main(int argc, char *argv[]) { int data[MAXSIZE][300]; int i, j, count; FILE *fp; if(argc != 2) { fprintf(stderr, "Usage: %s <filename>\n", argv[0]); exit(0); } if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "File %s is not found.\n", argv[1]); exit(0); } for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i]) == EOF) break; } simpleSort(data[], 0, i - 1); for(j = 0; j < i; j++) printf("%s\n", data[j]); } void swapData(char *x, char *y){ char tmp[300]; strcpy(tmp, x); strcpy(x, y); strcpy(y, tmp); } void simpleSort(char data[], int first, int last) { int i, j; for(i = first; i < last; i++){ for(j = i+1; j <= last; j++){ if(strcmp(&data[i], &data[j]) > 0) swapData(&data[i], &data[j]); } } } 読み込んだ文字データをシンプルソートするプログラムなんですが、コンパイルできません。 simpleSortの部分がおかしいみたいなんですが、見直しても先入観からか間違いを見つけられません・・・・ どなたか間違いを指摘していただけたら助かります。

  • セグメンテーション違反

    OSはリナックスでC言語です。 #include<stdio.h> #include<stdlib.h> typedef struct{ int id; char *name; }user; int main(void) { user *users; int i,j; users=(user *)malloc(sizeof(user)*100); for(j=0;j<5;j++) scanf("%d",&(users+j)->id); scanf("%s",(users+j)->name); free(users); printf("input your id;"); scanf("%d",&i); printf("NO%d %s\n",(users+i)->id,(users+i)->name); return 0; } 上記のプログラムソースでセグメンテーション違反と出てしまいます。 原因はなんなのでしょうか。 教えていただければ光栄です。

  • C言語 セグメンテーション違反

    最大値検索法のプログラムソースを書きましたが、 実行すると、セグメンテーション違反となってしまいます。 どこがおかしいのでしょうか? 分かる方、教えてください。 宜しくお願いします。 swapのソース #include <stdio.h> void swap(int *px,int *py); int main (void) { FILE *fp; if ((fp=fopen("file.txt","rt"))==NULL){ printf("File open error.\n"); //ファイルが無い場合のエラー処理// return 0; } int i,a[10]; for(i=0;i<100;i++){ fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。// } fclose(fp); //初期データの並びの表示// for(i=0;i<10;i++) printf("[%d]=%d\n",i,a[i]); /*1.ソートすべきデータの中で最大のデータを見つけ、 2.そのデータを最後のデータと入れ替える。 最大データは配列のどこにあるのか⇒maxi              その値⇒max とする。*/ //データが10個の場合 int max,maxi,j; max=a[0],maxi=0; for(i = 0;i < 9; i++){ if(a[i + 1] > max){ max = a[i + 1]; maxi = i + 1; } swap(&a[maxi],&a[9-j]); for(j=0;j<9;j++){ printf("%d \n",j); printf("i=%d\n ",i); max=a[0], maxi=0; for(i=0;i<9-j;i++){ //最大値をもつデータ探索;(カウンタ変数) max++; //最大データと探索範囲最後のデータとの入れ替え: int n; n=maxi; maxi=max; max=n; printf("maxi=%d \n ",maxi); printf("i=%d\n ",i); printf("j=%d \n",j); } } if((fp=fopen("file.txt","wt"))==NULL){ printf("File open error.\n"); return 0; } for(i=0;i<100;i++){ fprintf(fp,"%d,",a[i]); } fclose(fp); } sortのソース #include<stdio.h> void swap (int *px,int *py); void swap (int *px,int *py) { int n; n =*px; *px = *py; *py = n; }

  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • fputs:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • プログラミング(配列と関数の引数)

    a : ABCDE a : ABCDEFGH Len : 8 a : FGHIJ a : FGH a : FGH, c : FGH 上記のように表示されるプログラムを作りたいのですが、なかなかできません。下記のようなプログラムを作ったのですがどこが間違っているのかよくわかりません。分かる方、指摘をお願いします。 #include <stdio.h> void my_strcpy(char s[], char t[]); int my_strlen(char s[]); void my_strcat(char s[], char t[]); int main(){ char a[10]; char b[10] = "ABCDE"; char c[] = "FGH"; int len; my_strcpy(a, b); printf("a : %s\n", a); my_strcat(a, c); printf("a : %s\n", a); len = my_strlen(a); printf("Len : %d\n", len); my_strcpy(a, "FGHIJ"); printf("a : %s\n", a); a[3] = '\0'; printf("a : %s\n", a); if(strcmp(a, c) == 0){ printf("a : %s, c : %s\n", a, c); } int i, s, t; my_strcpy(a, b + 2); printf("a : %s\n", a); void my_strcpy(char s[], char t[]){ for (i = 0; t[i] != '\0'; i++){ s[i] = t[i]; } s[i] = '\0'; } int my_strlen(char s[]){ int i; for (i = 0; s[i] != '\0'; i++); return i; } void my_strcat(char s[], char t[]){ int i, j; for (i = 0; s[i] != '\0'; i++); for (j = 0; t[j] != '\0'; i++, j++){ s[i] = t[j]; } s[i] = '\0'; } }

  • セグメンテーションエラーです

    行列の積の計算のプログラムです #include <stdio.h> #include <math.h> #define MN 1200 int main() { double A[MN][MN],B[MN][MN],C[MN][MN]; int i,j,k; double an=0,am=0,bn=0,bm=0; FILE *fp1; FILE *fp2; FILE *fp3; fp1 = fopen("1200A.dat", "r"); for(i=0;i<am;i++){ for(j=0;j<an;j++){ fscanf(fp1,"%lf",&A[i][j]); } } fclose(fp1); fp2=fopen("1200B.dat","r"); for(i=0;i<bm;i++){ for(j=0;j<bn;j++){ fscanf(fp2,"%lf",&B[i][j]); } } fclose(fp2); for(i=0;i<am;i++){ for(j=0;j<bn;j++){ C[i][j]=0.0; for(k=0;k<bm;k++){ C[i][j]+=A[i][k]*B[k][j]; } } } fp3=fopen("ans1200C.dat","w"); for(i=0;i<am;i++){ for(j=0;j<bn;j++){ fprintf(fp3,"%lf ",C[i][j]); } fprintf(fp3, "\n"); } fclose(fp3); return 0; }

  • ヒープソートを教えてください

    本を読んで作ってみたのですが、ソートしてくれません。。 void down(int from, int to); void heapsort(char s[][WC],int n); void down(int from, int to){ int i=1, j; char s[NS][WC],val; val = s[from][WC]; i = from; while(i <= to/2){ j = i*2; if(j+1 <= to && strcmp(s[j],s[j+1])>0) j++; if(strcmp(s[j],s[from])>0) break; strcpy(s[i],s[j]); i = j; } s[i][WC] = val; } void heapsort(char s[][WC],int n) { int i; char tmp[WC]; for(i = n/2; i >= 1; i--) down(i, n); for(i = n; i >=2; i--){ strcpy(tmp,s[1]); strcpy(s[1],s[i]); strcpy(s[i],tmp); down(1, i-1); } }

専門家に質問してみよう