2016-07-16 21 views
1

Ich versuche, das Textformat einer Textdatei mit C zu ändern. Folgendes ist der Code, den ich ausprobiert habe. Das Problem mit der Ausgabe ist, dass der Code jede zweite Zeile der Textdatei überspringt.alternative Zeilen während der E/A in C gedruckt

Folgendes ist die Datei, die ich versuche zu formatieren.

Protein 
26709 
    1MET  N 1 1.826 3.097 3.556 -0.457 0.365 -0.163 
    1MET  H 2 1.769 3.168 3.512 -0.606 -0.305 -1.071 
    1MET  H2 3 1.781 3.006 3.565 0.271 0.041 0.264 
    1MET  H3 4 1.857 3.125 3.649 1.251 -2.295 0.144 
    1MET  CA 5 1.948 3.077 3.475 -0.538 -0.282 -0.098 
    1MET  HA 6 1.987 2.977 3.504 -2.137 -0.912 -0.071 
    1MET  CB 7 1.914 3.075 3.321 0.389 -0.161 -0.089 
    1MET HB2 8 1.848 2.987 3.306 -0.909 0.569 1.297 
    1MET HB3 9 1.869 3.176 3.311 -1.707 -1.073 -0.224 
    1MET  CG 10 2.034 3.050 3.220 0.171 0.344 -0.271 

Und ich bekomme die Ausgabe als:

Protein 

26709 

    1MET  H  2 1.769 3.168 3.512 -0.606 -0.305 -1.071 
    1MET  H3  4 1.857 3.125 3.649 1.251 -2.295 0.144 
    1MET  HA  6 1.987 2.977 3.504 -2.137 -0.912 -0.071 
    1MET  HB2  8 1.848 2.987 3.306 -0.909 0.569 1.297 
    1MET  CG 10 2.034 3.050 3.220 0.171 0.344 -0.271 
    1MET  HG3 12 2.017 2.974 3.140 2.388 1.184 -1.570 
    1MET  CE 14 2.245 3.113 3.036 0.088 -0.370 0.744 
    1MET  HE2 16 2.311 3.190 2.990 -0.737 -0.490 -0.665 
    1MET  C 18 2.043 3.195 3.504 -0.052 -0.237 -0.714 

Im Folgenden finden Sie den Code, die ich versucht habe:

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

int main(int argc, char *argv[]) 
{ 
    FILE *fp; 
    char buff[200],res[10],atm[10],atmNum[10],x[10],y[10],z[10],vx[10],vy[10],vz[10]; 
    if (argc<2){ 
     printf("SYTEM ABORT ! \n Provide the input GRO file"); 
     exit(1); 
    } 
    else 
     fp=fopen(argv[1],"r"); 
    while(fgets(buff,200,fp)!=NULL){ 
     if (strlen(buff) > 10) { 
      fscanf(fp,"%s %s %s %s %s %s %s %s %s",res,atm,atmNum,x,y,z,vx,vy,vz); 
      if (strcmp(atm,"Na")){ 
       printf("%7s %7s %5s %7s %7s %7s %7s %7s %7s",res,atm,atmNum,x,y,z,vx,vy,vz); 
      } 
      else 
       printf("%8s %7s %5s %7s %7s %7s %7s %7s %7s",res,atm,atmNum,x,y,z,vx,vy,vz); 
     } 
     else 
      printf("%s",buff); 

    } 
    fclose(fp); 
    return 0; 
} 

Da es die erste Zeile aus der Ausgabedatei ist zu sehen ist übersprungen, ich denke, das ist aufgrund der Verwendung von fgets in while Schleife. Aber danach druckt es alle abwechselnden Zeilen.

+3

Im positiven (length> 10) Fall Ihres 'if'-Blocks bin ich mir ziemlich sicher, dass Sie' sscanf' und den Puffer, den Sie gerade mit 'fgets' gezogen haben, als Datenquelle verwenden und nicht werfen es aus und mit 'fscanf', um die nächste Zeile zu bekommen. Ehrlich gesagt, sollten Sie auch das Ergebnis Ihres 'scanf' überprüfen, um sicherzustellen, dass alle Parameter, die Sie verwenden, tatsächlich gefüllt sind. Nimm nichts an. Annahme ist die Mutter aller ... – WhozCraig

+0

@WhozCraig Vielen Dank, das war eine einfache Lösung. – PythonNoob

Antwort

3

Aber Sie verwenden fgets() und dann fscanf() hier:

while(fgets(buff,200,fp)!=NULL) 
    if (strlen(buff) > 10) { 
    fscanf(fp,"%s %s %s %s %s %s %s %s %s",res,atm,atmNum,x,y,z,vx,vy,vz); 

so werden Sie eine Zeile mit fgets() gelesen und Sie werden die nächste Zeile mit fscanf, was in Überspringen der Zeile gelesen, wie du sagst.


Wie WhozCraig sagte, Sie sscanf(), statt fscanf() verwenden sollten.

+0

Ja, das stimmt, aber ich wusste nicht, dass es auch jede alternative Zeile überspringt. Aber ja, es läuft in einer Weile. Das macht Sinn. Danke :) – PythonNoob

+0

Sie sind herzlich willkommen @PythonNoob, Sie haben eine gute Frage, deshalb konnten wir helfen. ;) – gsamaras