C言語・pdbファイルで起こるSegmentation faultについて
pdbファイルを扱ってそこから情報を取ろうと思っているんでんですがSegmentation fault: 11が出てしまって。わからなくなってしまいました。具体的にはPDBの1行目がATOMかつ3行目がCAとなっている列の中から6,7,8行目の数値を出力したいと考えています。どうぞ教えてください。
発生している問題・エラーメッセージ
Segmentation fault: 11
該当のソースコード
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include"PDB.h" #define N 256 int main(int argc,char* argv[]){ FILE* fpt; char* readline; int Atom_count = 0; int CA_count = 0; arrayPDB* pdb; if((fpt=fopen(argv[1],"r"))==NULL){ printf("ファイルが存在しません\n"); return(-1); } while(fgets(readline,N,fpt) != NULL){ if(strcmp(readline,"A")==0 && strcmp(readline+1,"T")==0 && strcmp(readline+2,"O")==0){ Atom_count++; if(strcmp(readline+13,"C")==0 && strcmp(readline+14,"A")==0){ CA_count++; } } } pdb->numAtom = Atom_count; pdb->numCAAtom = CA_count; pdb->CA = (Atom*)malloc(sizeof(float)*CA_count); fseek(fpt,0L,SEEK_SET); while(fgets(readline,N,fpt) != NULL){ if(strcmp(readline,"A")==0&&strcmp(readline+1,"T")==0&&strcmp(readline+2,"O")==0){ if(strcmp(readline+13,"C")==0 && strcmp(readline+14,"A")==0){ if(strcmp(readline+31,"-")==0){ pdb->CA->x = (-1)*(atof(readline+32)*10+atof(readline+33)+atof(readline+34)*0.1+atof(readline+35)*0.01+atof(readline+36)*0.001); } else if(strcmp(readline+32,"-")==0){ pdb->CA->x = (-1)*(atof(readline+33)+atof(readline+35)*0.1+atof(readline+36)*0.01+atof(readline+37)*0.001); } else{ pdb->CA->x = atof(readline+32)*10+atof(readline+33)+atof(readline+35)*0.1+atof(readline+36)*0.01+atof(readline+37)*0.001; } if(strcmp(readline+40,"-")==0){ pdb->CA->y = (-1)*(atof(readline+41)*10+atof(readline+42)+atof(readline+44)*0.1+atof(readline+45)*0.01+atof(readline+46)*0.001); } else if(strcmp(readline+41,"-")==0){ pdb->CA->y = (-1)*(atof(readline+42)+atof(readline+44)*0.1+atof(readline+45)*0.01+atof(readline+46)*0.001); } else{ pdb->CA->y = atof(readline+41)*10+atof(readline+42)+atof(readline+44)*0.1+atof(readline+45)*0.01+atof(readline+46)*0.001; } if(strcmp(readline+47,"-")==0){ pdb->CA->z = (-1)*(atof(readline+48)*10+atof(readline+49)+atof(readline+51)*0.1+atof(readline+52)*0.01+atof(readline+53)*0.001); } else if(strcmp(readline+48,"-")==0){ pdb->CA->z = (-1)*(atof(readline+49)+atof(readline+51)*0.1+atof(readline+52)*0.01+atof(readline+53)*0.001); } else{ pdb->CA->z = atof(readline+48)*10+atof(readline+49)+atof(readline+51)*0.1+atof(readline+52)*0.01+atof(readline+53)*0.001; } printf("%f %f %f\n",pdb->CA->x,pdb->CA->y,pdb->CA->z); pdb->CA++; } } } free(pdb->CA); return(0); }
試したこと
1度ファイルを最初から最後まで読み取り、1行目、3行目
でそれぞれ特定の文字があったら、その数をカウントし、一度リセットして、そこの6,7,8行目の数値を出力しようと思ってしました。
補足情報(FW/ツールのバージョンなど)
//pdbファイルの一部
ORIGX3 0.000000 0.000000 1.000000 0.00000 121P 100
SCALE1 0.024876 0.014362 0.000000 0.00000 121P 101
SCALE2 0.000000 0.028724 0.000000 0.00000 121P 102
SCALE3 0.000000 0.000000 0.006196 0.00000 121P 103
ATOM 1 N MET 1 -13.229 7.434 -18.546 1.00 14.06 0 121P 104
ATOM 2 CA MET 1 -11.966 6.732 -18.567 1.00 17.27 0 121P 105
ATOM 3 C MET 1 -11.956 5.664 -17.491 1.00 16.41 0 121P 106
ATOM 4 O MET 1 -12.756 5.685 -16.545 1.00 16.12 0 121P 107
ATOM 5 CB MET 1 -10.765 7.673 -18.306 1.00 17.94 0 121P 108
//構造体
typedef struct arrayPDB arrayPDB ;
struct arrayPDB{
int numAtom;
int numCAAtom;
Atom* CA;
};
typedef struct Atom Atom;
struct Atom{
float x;
float y;
float z;
};
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。