2017-02-09 4 views
0

J'ai remarqué que fscanf ne fonctionne pas avec les compilateurs C déterminé (Intel, Cray), donc je veux utiliser fgets pour lire un fichier d'entrée simple qui contient des chaînes et des nombres entiersComment lire des fichiers avec des chaînes et des entiers en utilisant fgets

$cat input.txt 
st 10 167 POP 456 244 NONE ENERGY 

que je pouvais faire quelque chose comme ça

int main() 
{ 
    FILE *ptr_file; 
    char buf[1000]; 

    ptr_file = fopen("input.txt", "r"); 
    if (!ptr_file) 
     return 1; 

    for (int i = 0; i < 8; i++) { 
     fgets(buf, 1000, ptr_file); 
     printf("%s", buf); 
    } 

    fclose(ptr_file); 
    return 0; 
} 

pour lire le fichier, puis créer un switch case soit stocker la valeur de buf dans un integer ou un string. Ce n'est évidemment pas très efficace et je me demandais si quelqu'un avait une meilleure idée.

+2

Le 'fgets' va obtenir votre entrée dans un tableau de caractères. Vous devrez toujours extraire les données du tableau de caractères. En C, vous pouvez utiliser 'sscanf' après' fgets'. –

+0

Avez-vous une structure 'struct' pour contenir les valeurs associées? Ou utilisez-vous un ensemble de tableaux parallèles? Vous devez savoir ce que vous allez remplacer 'printf()' par - comment vous allez interpréter et stocker ce qui ressemble à 8 champs dans l'entrée pour un traitement ultérieur. –

+0

@ThomasMatthews 'sscanf' semble fonctionner, mais' fscanf' échoue ... – Manolete

Répondre

1

Pensez à utiliser sscanf, essentiellement quelque chose comme ça

 // st 10 167 POP 456 244 NONE ENERGY 
    sscanf(buf, "%s %d %d %s %d %d %s %s", var1, &var2....); 
+0

@_Aniruddh Dikhit Savez-vous pourquoi 'sscanf' fonctionne et' fscanf' non? – Manolete

+1

Il est préférable de vérifier la valeur de retour de 'sscanf()' et d'utiliser les largeurs pour '"% s "' comme '"% 9s "'. – chux