2014-09-13 3 views
0

J'écris actuellement un programme qui lit des nombres à partir de deux nombres à partir d'un fichier texte et les imprime. J'aimerais utiliser les chiffres pour déterminer un GCD plus tard, mais je dois d'abord pouvoir les numériser à partir du fichier. Le fichier texte ressemble à ceci:La fonction fscanf ne fonctionne pas

24  72 
25  50 
31  89 
... 

Tab est pressée entre chaque numéro dans la première rangée et chaque numéro dans le second.

Je suis venu avec ce jusqu'à présent (en commentaire la section doit être utilisée pour déterminer la GCD):

/* 
File name: euclid.cpp 
This program find the largest common multiple of two numbers using the Euclid method. 
*/ 

#include <stdio.h> 
#include "genlib.h" 
#include "simpio.h" 

int main() 
{ 
    FILE *input; 
    long num1=0, num2=0, orinum2=0, rem=0, gcd=0; 
    int i=0, size=0; 
    char temp; 

    input=fopen("Euclid.txt", "r"); 

    while((temp=getc(input))!=EOF) 
    { 
     if(temp=='\n') size++; 
    } 
    size++; 

    while(i<size) 
    { 
     fscanf(input, "%d\t%d%[^\n]", &num1, &num2); 
     printf("%d\t%d\n", num1, num2); 
     orinum2=num2; 
/*  while (true) 
     { 
      rem=num1%num2; 
      if (rem==0) 
      { 
       gcd=num2; break; 
      } 
      else 
      { 
       num1=num2; 
       num2=rem; 
      } 
     } 
     printf("The GCD of %d and %d is %d.\n", num1, orinum2, gcd); 
*/  i++; 
    } 

    fclose(input); 

} 

Chaque page Web unique et des ressources que j'ai vérifié dicte que cela devrait fonctionner, mais pour une raison pour laquelle ce n'est pas le cas.

Répondre

0

fscanf sera « renvoie le nombre d'éléments d'entrée appariés avec succès et assignés »:

#include <stdio.h> 

int main() 
{ 
    FILE *input = fopen("input.txt", "r"); ; 
    int num1, num2; 

    while(fscanf(input, "%d %d", &num1, &num2) > 0) 
     printf("%d\t%d\n", num1, num2); 

    fclose(input); 
} 

Le motif (« % d% d ») va correspondre et assigner deux entiers, séparés par un nombre quelconque de whitespace characters.

Les caractères d'espace incluent votre onglet (\ t) et le retour à la ligne (\ n).

+0

Pourriez-vous clarifier votre 3e point? AS pour le point 2, l'entrée n'a pas réellement les caractères "/" et "t", et j'ai changé ma mise en forme dans la publication originale pour représenter avec précision le fichier texte. Il semble que stackoverflow gâche mon formatage si ce n'est pas fait dans un segment de code. –

+0

Alors, comment changeriez-vous la mise en forme pour qu'elle lise l'info jusqu'à ce qu'elle rencontre une nouvelle ligne? [^ \ n] est la façon dont la plupart des gens sur Internet semblent recommander. –

+0

Le troisième point concernait les expressions régulières (https://en.wikipedia.org/wiki/Regular_expression). [^ \ n] signifie (Anything sauf newline) dans regexp. Le motif fscanf n'est PAS une expression rationnelle, donc vous ne pouvez pas l'utiliser ici. – folkol