2010-12-29 6 views
0

J'ai travaillé sur ce code mais je ne peux pas trouver ce qui ne va pas. Ce programme se compile et s'exécute mais il finit par avoir une erreur fatale.C: manipulation de fichiers Impossible de comprendre comment simplifier ce code avec la manipulation de fichiers

Le programme lit un fichier et recueille les nombres afin de calculer le total (après les avoir convertis en flottant). Ensuite, il lit le fichier et affiche celui qui a moins de 10.00

J'ai un fichier appelé monFichier.txt, avec le contenu suivant:

James ------ 07,50 Anthony --- 17,00

Ainsi, l'affichage doit être

  1. le total est 24,50
  2. est ici celui avec moins de 10.00:
  3. James qui a 07,50

Et voici le code:

int main() 
{ 
    int n =2, valueTest=0,count=0; 
    FILE* file = NULL; 
    float temp= 00.00f, average= 00.00f, flTen = 10.00f; 
    float *totalNote = (float*)malloc(n*sizeof(float)); 

    int position = 0; 
    char selectionNote[5+1], nameBuffer[10+1], noteBuffer[5+1]; 

    file = fopen("c:\\myFile.txt","r"); 
    fseek(file,10,SEEK_SET); 
    while(valueTest<2) 
    { 
     fscanf(file,"%5s",&selectionNote); 
     temp = atof(selectionNote); 
     totalNote[position]= temp; 
     position++; 

     valeurTest++; 
    } 

    for(int counter=0;counter<2;counter++) 
    { 
      average += totalNote[counter]; 
    } 
    printf("The total is : %f \n",average); 

    rewind(file); 
    printf("here is the one with less than 10.00 :\n"); 

    while(count<2) 
    { 
     fscanf(file,"%10s",&nameBuffer); 

     fseek(file,10,SEEK_SET); 
     fscanf(file,"%5s",&noteBuffer); 
     temp = atof(noteBuffer); 

     if(temp<flTen) 
     { 
      printf("%s who has %f\n",nameBuffer,temp); 
     } 
     fseek(file,1,SEEK_SET); 
     count++; 
    } 
    fclose(file); 

}

Je suis assez nouveau à c et trouve qu'il est plus difficile que C# ou java. Et je voudrais avoir quelques suggestions pour m'aider à aller mieux. Je pense que ce code pourrait être plus simple. Pensez-vous la même chose?

Répondre

1

Vous ne mentionnez pas la plate-forme et le compilateur que vous utilisez. Je vais deviner MSVC et Windows, étant donné que votre nom de fichier utilise un chemin de style Windows.

Vous dites que le code compile et s'exécute mais avez-vous activé les avertissements de votre compilateur? Cela pourrait vous donner plus d'indices sur des choses potentiellement incorrectes que vous pourriez faire. Après avoir corrigé certaines fautes d'orthographe et ajouté les en-têtes include standard, j'ai compilé votre code dans gcc qui avertissait des discordances entre les chaînes de format fscanf et les arguments. En particulier, vous passez un pointeur vers les tableaux char ce qui n'est pas ce que vous voulez dire. Vous pouvez lire des tableaux et des pointeurs en C, par ex. dans le C FAQ. Le reste des entrées de ce document est également très éclairant.

+0

Je recherche dans ce au grâce de moment pour le souligner! –

0

Très probablement, votre erreur fatale provient de la déclaration

fscanf(file,"%5s",&selectionNote); 

Normalement, une expression de type tableau comme selectionNote sera implicitement convertie en un type de pointeur (voir note 1), dans ce cas la & n'est pas nécessaire:

fscanf(file, "%5s", selectionNote); 

vous n'expliquez pas ce que le code est supposé faire, donc je ne sais pas exactement comment vous dire comment restructurer.


  1. Sauf quand il est l'opérande de l'opérateur sizeof ou l'opérateur & unaire, ou est un littéral chaîne utilisée pour initialiser un tableau, une expression qui a le type « » tableau de type « » est convertie à une expression avec le type '' pointer to type '' qui pointe vers l'élément initial de l'objet tableau et n'est pas un lvalue. Si l'objet tableau a une classe de stockage de registre, le comportement n'est pas défini. - Norme C Langue (projet n1256), section 6.3.2.1, paragraphe 3.
+0

Oh oui ok je vais regarder ça. Oups désolé je viens d'ajouter le but de ce programme. –

0
  1. Au lieu d'utiliser fscanf suivi par atof, utilisez une seule fscanf avec une chaîne de format adapté (%f):

    fscanf(file, "%f", &totalNote[position]); 
    
  2. Vous pouvez utiliser la valeur de retour de fscanf pour la terminaison de la boucle, au lieu d'utiliser la variable valueTest et la 2 constante:La première boucle lue à partir du fichier doit analyser les noms et les numéros, même si vous n'avez besoin que de chiffres!

  3. Vous pouvez cumuler les nombres dans la même boucle qui les lit. Si vous faites cela, vous pouvez supprimer le tableau totalNote (cette « simplification » ne convient pas si vous pensez que vous prolongerez votre code pour faire d'autres choses avec les chiffres, ne calcule pas seulement le total)

  4. La seconde boucle lit le fichier (celui après rewind) est mieux exprimé avec for que while:

    for (count = 0; count < counter; count++) 
    ... 
    
  5. Dans la même boucle, vous devez absolument ne pas besoin d'utiliser fseek! Il désordre votre code, ainsi il lira seulement "James" du dossier, et ne procédera jamais à "Anthony"

  6. Vous voudrez probablement enlever le remplissage "----" des noms avant de les imprimer; vous pouvez le faire avec strchr ou strtok:

    fscanf(file,"%10s",&nameBuffer); 
    strtok(nameBuffer, "-");