2015-07-12 3 views
-2

Avec l'aide de cette communauté, j'ai réussi à écrire un code pour extraire un extrait d'un fichier xvg d'entrée dont j'ai besoin. Ca marche presque pour moi mais ça a un léger problème avec strncmp. Je veux avoir une partie de ce fichier d'entrée dit 1000 à 2000 avec des lignes commençant par @ et #, donc je stocke ces valeurs dans les chaînes nommées starting_point et stopping_point.Problem est qu'il ne reconnaît pas le starting_point et le stopping_point. une sortie aléatoire est stockée dans le fichier de sortie.Problème Strncmp dans un programme C

Cela fonctionne très bien les petits fichiers d'entrée.

Mais ne fonctionne pas avec les fichiers d'entrée affichés.

#include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <ctype.h> 
    #define MAXS 256 
    int main (void) 
    { 
    char line[MAXS] = {0}; 
    char s1[MAXS]; 
    int length1,length2; 
    char starting_point[MAXS]="1000"; 
    char stopping_point[MAXS]="2000"; 
    FILE *fs; 

     fs=fopen("md_new.xvg","w"); 

     while (fgets (line, MAXS, stdin) != NULL) { 
      char *p = line; 
      size_t len = strlen (line); 
     while (len > 0 && (line[len-1] == '\n' || line[len-1] == '\r')) 

      line[--len] = 0; /* strip newline or carriage rtn */ 
      length1 = strlen(starting_point); 
      length2 = strlen(stopping_point); 


      /* storing lines beginning with '#' or '@' or blank lines */ 

      **if (*p == '#' || *p == '@' || !*p) 
      { 
      fprintf (fs,"%s\n", line); 
      printf("%s\n",line); 
      } 
      if (strncmp (p,starting_point, length1) == 0) 
      { 
      fprintf (fs,"%s\n", line); 
      printf("%s\n",line); 
      if (strncmp (p,stopping_point, length2) == 0) 
      break;     
      } 
     }** 

    return 0; 
    } 

fichier d'entrée

ressemble à quelque chose ce

# 
    #mdrun is part of G R O M A C S: 
    # 
    #Go Rough, Oppose Many Angry Chinese Serial killers 
    # 
    @ title "dH/d\xl\f{}, \xD\f{}H" 
    @ xaxis label "Time (ps)" 
    @ s0 legend "dH/d\xl\f{} \xl\f{} 0.1" 
    @ s1 legend "\xD\f{}H \xl\f{} 0.05" 
    @ s2 legend "\xD\f{}H \xl\f{} 0.15" 
    0.0000 -33.8598 1.71168 -1.66746 
    0.2000 -34.3949 1.73192 -1.702 
    0.4000 -31.8213 1.61262 -1.56193 
    0.6000 -32.3563 1.63639 -1.59224 
    0.8000 -33.6158 1.69898 -1.65539 
    1.0000 -32.5242 1.65055 -1.59363 
    1.2000 -33.7464 1.70708 -1.6607 
    1.4000 -33.0552 1.68563 -1.60985 
    1.6000 -32.9946 1.66834 -1.62445 
    1.8000 -31.6345 1.60933 -1.54529 
    2.0000 -33.1246 1.67736 -1.62769 
    2.2000 -33.9822 1.71743 -1.67394 
    2.4000 -32.4887 1.64732 -1.59384 
    2.6000 -30.0927 1.5349 -1.46508 
    so on till 100000.000 
+1

Pour obtenir de l'aide, vous devrez spécifier exactement ce qui est faux, quelle ligne est défaillante, ce qu'il fait et ce que vous attendiez .... Et pour l'amour de Dieu s'il vous plaît indent correctement –

+0

@mark lakata Cher monsieur, Je ne comprends pas comment indenting fonctionne. Je ne suis pas programmeur régulier. J'aimerais pouvoir être un. J'ai corrigé mon message autant que possible et le problème est avec la section strncmp. –

+1

Le bloc if à tester pour le point d'arrêt ne sera jamais exécuté car il se trouve dans le bloc if où le démarrage est testé. – alvits

Répondre

0

Comme vous dites que vous n'êtes pas un programmeur, vous pouvez envisager d'utiliser quelque chose d'autre que c pour faire ce travail.

Tenir compte awk, qui peut faire ce que vous voulez dans une ligne

awk '(/^1000/,/^2000/) || /^[@#]/{print;}' inputfile > outputfile