2016-05-24 12 views
1

Ich habe diese Daten in der DateiWert in Schleife zurückkehren tut

ATOM  1 N MET A 1  25.909 16.164 -8.037 
ATOM  2 CA MET A 1  25.498 14.786 -8.206 
ATOM  3 C MET A 1  26.612 13.934 -8.806 
ATOM  4 O MET A 1  27.442 14.402 -9.588 

dies mein vollständiger Code ist

#include<stdio.h> 
#include<math.h> 
typedef struct prot { 
    char atom[10]; 
    int atomno; 
    char site[10]; 
    char residue[10]; 
    char chain; 
    int residueno; 
    float x, y, z; 
} Td; 
int main() 
{ 
    FILE*fd; 
    fd=fopen("2zoi.pdb","r+"); 
    Td data[1300]; 
    char buffer[1300]; 
    int a=0; 


    while(fgets(buffer, 1300, fd)) 
    { 
     sscanf(buffer, "%s %d %s %s %c %d %f %f %f",data[a].atom,&data[a].atomno,data[a].site, 
       data[a].residue,&data[a].chain,&data[a].residueno,&data[a].x, &data[a].y, &data[a].z); 

     printf("%s %d %s %s %c %d %6.3f %6.3f %6.3f \n",data[a].atom,data[a].atomno,data[a].site, 
       data[a].residue,data[a].chain,data[a].residueno,data[a].x, data[a].y, data[a].z); 
     a++; 
    } 

    //---user input 

    int fr,sr; 
    int fa,sa; 
    int i=0; 
    float x1,x2,y1,y2,z1,z2; 
    float distance=0; 

    printf("Enter first no of atom :"); 
    scanf("%d",&fa); 

    printf("Enter second no of atom :"); 
    scanf("%d",&sa); 


while(data[i].atomno>=0) 
{ 
    if(fa==data[i].atomno) 
    { 
     x1=data[i].x; 
     y1=data[i].y; 
     z1=data[i].z; 
    } 

    else if(sa==data[i].atomno) 
    { 
     x2=data[i].x; 
     y2=data[i].y; 
     z2=data[i].z; 
    } 
    i++; 

} 
printf("%f %f %f",x1,y1,z1); 
printf("%f %f %f",x2,y2,z2); 
    //distance= sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2) + pow((z2 - z1), 2)); 
    //printf("%6.3f",distance); 
    return 0; 
} 

das Problem ist in diesem Teil

printf("%f %f %f",x1,y1,z1); 
printf("%f %f %f",x2,y2,z2); 

ich versuche zurückzukehren zu Werten von der obigen Schleife, wo der Wert für x1, y1, z1 für das erste Atom und x2, y2, z2 für das zweite Atom ist.

wenn i Eingang 3 und 4 gibt es

26.612 13.934 -8.806 
27.442 14.402 -9.588 

beantworten, die korrekt ist. aber wenn ich 1 und 2 eingib, gibt es eine müllantwort. es scheint, als ob ich Nummer 2 auch Nummer 10 eingeben könnte. Habe ich einen Fehler gemacht?

+1

'while (Daten [i] .atomno> = 0)': 'Td Daten [1300];' es ist nicht initialisiert. – BLUEPIXY

+0

Tun Sie sich einen Gefallen und prüfen Sie, ob die verschiedenen 'scanf()' - Familienfunktionen die erwartete Anzahl konvertierter Werte zurückgeben. Im Allgemeinen ist es eine gute Idee zu testen, dass Eingabefunktionen funktionieren. –

+0

Bitte bearbeiten Sie Ihren Beitrag und korrigieren Sie die Einrückung. – Lundin

Antwort

2

Sie haben ein großes Problem mit data Array-Werte: nicht alle Elemente des Arrays sind auf 0 gesetzt, dann kann die letzte Schleife gebrochen werden. Sie können memset verwenden, um alle data Arrays auf 0 zurückzusetzen.

#include<stdio.h> 
#include<math.h> 
#include <string.h> 

typedef struct prot 
{ 
    char atom[10]; 
    int atomno; 
    char site[10]; 
    char residue[10]; 
    char chain; 
    int residueno; 
    float x, y, z; 
} Td; 

int main() 
{ 
    FILE*fd; 
    Td data[1300]; 
    char buffer[1300]; 
    size_t a=0; 

    fd=fopen("2zoi.pdb","r+"); 
    if (fd != NULL) 
    { 
     memset(data, 0x00, sizeof(data)); 

     while ((fgets(buffer, 1300, fd)) && (a < sizeof(data)/sizeof(data[0]))) 
     { 
      sscanf(buffer, "%s %d %s %s %c %d %f %f %f",data[a].atom,&data[a].atomno,data[a].site, 
        data[a].residue,&data[a].chain,&data[a].residueno,&data[a].x, &data[a].y, &data[a].z); 

      printf("%s %d %s %s %c %d %6.3f %6.3f %6.3f \n",data[a].atom,data[a].atomno,data[a].site, 
        data[a].residue,data[a].chain,data[a].residueno,data[a].x, data[a].y, data[a].z); 
      a++; 
     } 

     //---user input 

     int fr,sr; 
     int fa,sa; 
     size_t i=0; 
     float x1,x2,y1,y2,z1,z2; 
     float distance=0; 

     printf("Enter first no of atom :"); 
     scanf("%d",&fa); 

     printf("Enter second no of atom :"); 
     scanf("%d",&sa); 

     while ((data[i].atomno>=0) && (i < sizeof(data)/sizeof(data[0]))) 
     { 
      if(fa==data[i].atomno) 
      { 
       x1=data[i].x; 
       y1=data[i].y; 
       z1=data[i].z; 
      } 

      else if(sa==data[i].atomno) 
      { 
       x2=data[i].x; 
       y2=data[i].y; 
       z2=data[i].z; 
      } 
      i++; 

     } 
     printf("%f %f %f\n",x1,y1,z1); 
     printf("%f %f %f\n",x2,y2,z2); 
    } 
    else 
    { 
     fprintf(stderr, "Error opening file\n"); 
     exit(1); 
    } 

    return 0; 
} 

sollten Sie überprüfen die fopen Rückgabewert, sondern als eine Standard-Regel (wie Sie in Code geschrieben sehen): Sie sollten immer Funktionen überprüfen Werte zurückgeben.