2012-03-21 3 views
2

Je suis analyse un fichier pour la correspondance de mot-clé particulier par le programme C, voici mon exemple de code ...C: l'analyse syntaxique du fichier sans perdre l'espace blanc

#include <stdio.h> 

int main() { 

    FILE *infile = fopen("Somefile.txt", "r"); 

    char buffer[256]; 
    char value[128]; 

    while (fgets(buffer, sizeof(buffer), infile)) 
     if (1 == sscanf(buffer, " x = %s", value)) 
      printf("Value = %s\n", value); 
    return 0; 
} 

Somefile.txt

some junk 
#a comment 
a = 1 ; a couple other variables. 
b = 2 
x = 3 
x = 4 
x=5 
x = Hi hello 

sortie:

Value = 3 
Value = 4 
Value = 5 
Value = Hi 

problème: lorsque x contiennent la valeur comme « Salut Bonjour », il analyse juste « Salut » seulement, je vouloir analyser toute la valeur de x sans perdre de place.

veuillez me suggérer une solution pour cela.

Merci.

+0

La norme C n'a aucune fonction vraiment conçue pour ce que vous voulez. Mais presque tous les fournisseurs de compilateurs fournissent une fonction qui * fait * ce que vous voulez. Alternativement, lisez le fichier et faites le format d'analyse. –

+0

http://stackoverflow.com/questions/6853789/how-do-i-scan-spaces-into-a-a-string – vrdhn

Répondre

2

Dans cette ligne de code:

if (1 == sscanf(buffer, " x = %s", value)) 

%s signifie lire en un seul mot.

Si vous voulez lire dans le reste de la ligne, utilisez %[^\n]s comme ceci:

if (1 == sscanf(buffer, " x = %[^\n]s", value)) 
+0

Eh bien, oui, mais cela ne va que correspondre à la ligne 'x ='. –

+0

Umm, c'est le code exact que @nimit avait déjà et le seul problème qu'il avait avec ça était qu'il ne lisait pas toute la ligne. Cela va réparer ça. – lnafziger

+0

Et d'ailleurs, si vous lisez la question (et les exemples donnés), il veut seulement les lignes x. – lnafziger

0

La première chose à faire est de retour au large sur sscanf. Si vous lisez la page de manuel, scanf traite les espaces comme des spécifications qui disent «vous aurez des espaces blancs ici, ce n'est pas important». Ensuite, les autres caractères sont des spécifications pour littéraux. L'effet est que cette spécification de format est quelque chose comme "une quantité d'espace while, puis un x, puis plus d'espace blanc, puis un '=', puis plus d'espace blanc, puis une chaîne, et maintenant retourner la chaîne."

Ce que vous essayez vraiment de faire ici est une analyse légère. Vous allez probablement faire mieux de lire chaque ligne et le scanner avec une simple machine à états finis, à savoir,

while not end of file 
    while not end of line 
     get next character 
     if char == ";" -- comment 
     break 
     if char is a letter 
     parse an assignment 

et ainsi de suite.

+0

Pas utile, je veux juste analyser la valeur de x. – Nimit