2013-07-29 5 views
3

Je lis dans un fichier et après avoir lu un nombre, je veux passer à la partie restante de cette ligne. Un exemple d'un fichier est ceSauter le reste de la ligne avec fscanf dans C

2 This part should be skipped 
10 and also this should be skipped 
other part of the file 

Au moment où je résoudre ce problème en utilisant cette boucle:

char c = '\0'; 
while(c!='\n') fscanf(f, "%c", &c); 

Je me demandais si toutefois il n'y a pas une meilleure façon de le faire. J'ai essayé, mais pour une raison quelconque, il ne fonctionne pas:

fscanf(f, "%*[^\n]%*c"); 

Je me serais attendu à ce tout lire jusqu'à la nouvelle ligne, puis lire aussi la nouvelle ligne. Je n'ai pas besoin du contenu, donc j'utilise l'opérateur *. Cependant, quand j'utilise cette commande, rien ne se passe. Le curseur n'est pas déplacé.

Répondre

12

Je vous suggère d'utiliser fgets() puis sscanf() à lire le numéro. La fonction scanf() est sujette à des erreurs et vous pouvez facilement obtenir la chaîne de format incorrecte qui peut sembler fonctionner dans la plupart des cas et échouer de manière inattendue dans certains cas lorsque vous constatez qu'elle ne gère pas certains formats d'entrée spécifiques.

Une recherche rapide pour scanf() problems sur TELLE montrer combien de fois les gens se trompent et rencontrez des problèmes lors de l'utilisation scanf().

fgets Au lieu de cela() + sscanf() donne vous donnera un meilleur contrôle et vous savez que vous avez lu une ligne et vous pouvez traiter la ligne que vous lisez à lire entier sur ce:

char line[1024]; 


while(fgets(line, sizeof line, fp)) { 

    if(sscanf(line, "%d", &num) == 1) 
    { 
    /* number found at the beginning */ 
    } 
    else 
    { 
    /* Any message you want to show if number not found and 
    move on the next line */ 
    } 
} 

Vous peut vouloir changer comment vous lisez num de line en fonction du format des lignes dans le fichier. Mais dans votre cas, il semble que l'entier soit situé au début ou pas du tout présent. Donc, ce qui précède fonctionnera bien.

+0

Je suis totalement d'accord. Cependant, utiliser 'fgets' et' sscanf' ne suffit pas si la ligne est plus longue que ce que consomme l'appel 'fgets' et si nvcleemp veut ignorer la partie non lue de la ligne. – jamesdlin

+0

Le format du fichier est un peu plus compliqué. Je l'avais simplifié pour cette question. Mais je peux travailler pour ça. Je vais devoir voir comment je devrais gérer les longues lignes, mais je pense que je peux me limiter à des lignes de longueur inférieure à 1024. – nvcleemp

1
#include <stdio.h> 

int main(){ 
    FILE *f = fopen("data.txt", "r"); 
    int n, stat; 
    do{ 
     if(1==(stat=fscanf(f, "%d", &n))){ 
      printf("n=%d\n", n); 
     } 
    }while(EOF!=fscanf(f, "%*[^\n]")); 
    fclose(f); 

    return 0; 
} 
+0

Revu C11 7.21.6.2.8, «Les caractères d'espace blanc d'entrée (tels que spécifiés par la fonction isspace) sont ignorés, sauf si la spécification inclut un spécificateur [, c ou n». La nécessité m'échappe toujours comme '% d' fonctionne exactement comme'% d'. Également essayé diverses entrées et reçu le même retour 'fscanf()'. Vos pensées sur la façon dont l'espace est utilisé? – chux

+0

@chux Ce que vous dites est correct. Je semble avoir mal compris. Merci de m'avoir signalé. – BLUEPIXY