2013-04-13 5 views
0

J'écris un programme de livre de notes pour l'école et je suis confus à propos d'une chose. Nous avons un fichier à lire qui a plusieurs ID d'étudiant et plusieurs scores. Serait faire ceci:Arrêter fscanf?

results = fscanf(gradebook, "%d %d %d %d", id, sco1, sco2, sco3); 

magasin le numéro dans les variables comme il lit arrêter alors le curseur quand il est à court de variables pour stocker les informations dans ... puis-je sauter à droite dans une fonction de calcul pour calculer la note finale avant de l'avoir bouclée le fscanf pour le prochain élève?

results = fscanf(gradebook, "%d %d %d %d", id, sco1, sco2, sco3); 
      getCalc(sco1, sco2, sco3); 

Est-ce autorisé? Merci de votre aide.

+1

Quels types sont 'id',' sco1', 'sco2' et' sco3'? Pointeurs? Sont-ils initialisés? –

Répondre

0

En réponse à votre première et deuxième questions: Le type de id, sco1, sco2 et sco3 devrait être int * (c'est un pointeur à un int), ces variables doivent indiquer explicitement int réels objets et vous devrait vérifier la valeur de retour (results) avant de les utiliser. Par exemple:

int a, b, c, d; 
int *id = &a, *sco1 = &b, *sco2 = &c, *sco3 = &d; 
int results = fscanf(gradebook, "%d %d %d %d", id, sco1, sco2, sco3); 
if (results == 4) { 
    getCalc(sco1, sco2, sco3); 
} 

En outre, GetCalc devrait accepter des arguments du type int *. Avec toutes ces exigences remplies, la réponse à votre troisième question est: Oui, vous pouvez appeler getCalc avec sco1, sco2 et sco3 comme arguments.

Comme vous l'avez probablement deviné, les variables de pointeur intermédiaires ne sont pas nécessaires ici, et cela peut être simplifié. Cependant, cette simplification nécessite une modification de votre expression fscanf (l'insertion des &addressof opérateurs):

int id, sco1, sco2, sco3; 
int results = fscanf(gradebook, "%d %d %d %d", &id, &sco1, &sco2, &sco3); 
if (results == 4) { 
    getCalc(&sco1, &sco2, &sco3); 
} 

Quel livre lisez-vous?

1

Ce qui suit est un exemple de travail donnant la note moyenne pour chaque numéro d'étudiant:

#include <stdio.h> 

int main(void) 
{ 
     int  id, sco1, sco2, sco3; 

     while (fscanf(stdin, "%d%d%d%d", &id, &sco1, &sco2, &sco3) == 4) 
     { 
       printf("%d: %g\n", id, (sco1+sco2+(double)sco3)/3.0); 
     } 
     return 0; 
} 
+1

Cela répond à la question "Quelle est la solution à ma tâche?" ... – Sebivor

1

Would faire:

résultats = fscanf (carnet de notes, « % d% d% d% d ", id, sco1, sco2, sco3);

stocke le nombre dans ces variables comme il lit puis arrêter le curseur lorsqu'il manque de variables pour stocker les informations dans?

Non, à moins qu'il soit dans une boucle while, il arrête exactement après avoir lu les quatre entrées UNE FOIS, sauf si vous utilisez la valeur de results pour contrôler une boucle while et appelez fscanf() plusieurs fois pour analyser 4 entrées à chaque appel.

Exemple: -

//Keeps reading unless it encounters less than 4 parameters, which might be the case 
//if an end of file is reached, or your data pattern changes. 

while( fscanf(gradebook, "%d %d %d %d", id, sco1, sco2, sco3) == 4) 
{ 
//You can pass the data of individual id, to calculate function, and compute the required 
//sum, total or other data locally in the function, there is really no reason to use pass 
//address in your case, so just transfer data using pass by value method. 
getCalc(id,sco1,sco2,sco3); 
} 
+1

La condition devrait être 'while (fscanf (...) == 4)', vous avez mal tapé. –

+0

Correction effectuée .... –