Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

les fichiers en c


gugumon

Messages recommandés

Bonjour,

Je suis débutant en langage c, et je dois faire un petit exercice, mais je ne trouve pas la solution, voici le problème:

 

j'ai un fichier Resultats.txt:

 

Nom Français Mathématique Science

------ ---------- --------------- ---------

Bolux 80 72 60

Anne 45 85 74

lepage 70 42 63

casta 55 67 42

 

Il faut écrire un autre fichier moyenne.txt en ajoutant une colonne moyenne calculé pour chaque élève.

 

Nom Moyenne Français Mathématique Science

------ ---------- --------- --------- --------

Bolux 70 80 72 60

Anne 68 45 85 74

lepage 58 70 42 63

casta 54 55 67 42

 

et ensuite trier ce fichier par ordre décroissant (au niveau de la moyenne)!

 

Je ne sais pas quelles sont les méthodes à utiliser, l'algorythme ne me semble pas diffcile, mais c'est au niveau du langage C que je bloque...merci de m'aider

 

Merci beaucoup d'avance :P

Lien vers le commentaire
Partager sur d’autres sites

Je sais lire le fichier (et c'est bien le seul truc truc que je sais faire ici, avec un fopen...), mais je ne sais pas comment récupèrer correctement une partie des informations (dans ce cas les points des élèves par ligne, pour pouvoir faire la moyenne, et pas les autres info...), ensuite je ne sais pas comment rajouter à un endroit bien précis (la colonne moyenne pousse les autres colonnes, je sais qu'il y a fseek, mais je ne comprend pas bien son fonctionnement) les données calculées.

Je n'ai jamais utilisé la librairie stdin en c, et ce petit exercice ne me semble pas évident à faire en c.

Si j'arrive dèjà à récupérer ce que je veux dans un fichier texte et à utiliser ces données (les recopier dans un autre fichier txt par exemple)...

 

:P

Lien vers le commentaire
Partager sur d’autres sites

Tu ne manipuleras pas le fichier comme ce que tu sembles croire (ajouter des données à un endroit précis en particulier). Il va falloir que tu copies l'entête du fichier telle-quelle, et que tu refabriques le reste.

D'où les opérations suivantes :

 

1 - ouverture du fichier en entrée

2 - ouverture du fichier en sortie

3 - recopie de l'entête du fichier d'entrée dans le fichier de sortie

4 - saut des noms de colonnes dans le fichier d'entrée

5 - création des noms de colonnes dans le fichier de sortie

6 - lecture des données contenues dans le fichier d'entrée (dans une liste de struct)

7 - calcul des moyennes et tri de la liste

8 - écriture des résultats avec un format prédéfini dans le fichier de sortie

9 - (éventuelllement copier / générer le "bas de page" du fichier de sortie)

10 - fermer les fichiers

11 - faire le ménage (libérer la mémoire allouée)

 

fseek te permet d'aller à une certaine adresse d'un stream, mais il faut que tu recalcules tout à partir de la première ligne de données.

Utilise plutôt des fscanf pour lire tes données et bosser avec deux fichiers.

IMHO c'est trop galère d'insérer tes données dans le stream du fichier que tu ouvres (tu n'es pas libre de manipuler les lignes comme tu veux !)

Lien vers le commentaire
Partager sur d’autres sites

Merci mais concrètement que dois je utiliser comme commande ?

Suis je obliger de connaître le contenu du fichier source ou y-a -t-il un moyen d'automatiser la tâche, en gros comment faire la différence entre le nom des élèves, les points, les caractères (-) car tout est char... Comment récupérer par exemple tout les noms dans un seul tableau et tout les points dans un autre tableau (quelle commande utiliser ?)et c'est quoi l'entête du fichier?

 

merci KewlCat

Lien vers le commentaire
Partager sur d’autres sites

Rassure-moi : ton fichier en entrée, il est formaté ? (i.e. les colonnes ont des largeurs fixes, ou elles sont séparées par des caractères spéciaux, tabulation ou autre)

C'est grâce à ça qu'on va pouvoir faire le tri entre le nom, la note de fr, etc.

 

Comme je l'ai dit plus haut, tu vas avoir besoin de fscanf()

Tu vas aussi avoir grandement besoin de strsep() ou strtok()

 

Tu es prié d'utiliser des struct pour stocker tes données : hors de question de faire quatre tableaux (un pour les noms, un pour les notes fr, etc.). Tu déclares une structure par élève (nom, note fr, note maths, note sciences, moyenne) que tu remplis à la lecture du fichier de résultats. Ensuite tu repasses tout ton tableau en revue pour calculer la moyenne, et ensuite c'est simple comme bonjour (sinon bonjour l'angoisse pour trier quatre tableaux en en prenant un comme référentiel !!).

Ce que j'appelle "entête du fichier" c'est tout ce qui se trouve avant les données significatives (la jolie présentation, les noms des colonnes et les jolies barres faites avec des "---") ...

Lien vers le commentaire
Partager sur d’autres sites

A toi de voir.

strtok() considère toute succession de whitespace (espace ou tab) comme une seule et unique séparation

strsep() permet de détecter les colonnes vides

 

Si tu n'as pas de risque d'avoir une colonne vide dans ton fichier, pas la peine de te casser la tête.

De plus, strsep() n'est pas présent dans les librairies de tous les compilos C (j'ai dû la reécrire quand j'ai fait du Pro*C sous Windows y'a pas très longtemps. C'est pas que ce soit très gros (une dizaine de lignes) mais ça m'aurait bien aidé de pas avoir à la refaire)

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...