IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

lire trier et afficher sur un fichier


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut lire trier et afficher sur un fichier
    bonsoir
    je suis entraine de réviser les fichiers ,et voici un exercice que je n'arrive pas à savoir pourquoi il ne marche pas ,malgré qu'il y a pas d'erreur !
    il s'agit d'ouvrir un fichier ,le remplir ,trier et puis l'afficher dans un même programme .
    voici mon essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include<stdio.h>
            #include<conio.h>
            #include<string.h>
            FILE *f;
            typedef struct 
                    {
                       char nom[20];
                       int  mat;
                    }etud;
            etud  tab[100],e;
            etud tmp;
            int main()
            {
                int l,i,j;
                char rep;
                etud e;
                f=fopen("etudiant.dat","w");
     
                do
                {
                                             printf("Pour  l'étudiant n° %d",i+1);
     
                                             printf("taper le nom :\n");
                                             scanf("%s",e.nom);
     
                                             printf("taper le matricule :\n");
                                             scanf("%d",&e.mat);
     
                                             fwrite(&e,sizeof(etud),1,f);
     
                                             printf("voulez vous tapper un autre etudiant ");
                                             scanf(" %c",&rep);
     
                }while(rep=='O'||rep=='o');                                      
                fclose(f);
     
                f=fopen("etudiant.dat","r+");
                 fseek(f,0,2);                           
                l=ftell(f)/sizeof(etud); 
                fread(tab,l*sizeof(etud),1,f);
                /*faire le tri*/
                for(i=0;i<l;i++)
                     for(j=i+1;j<l-1;j++)
                          if(strcpy(tab[i].nom,tab[j].nom)>0)
                                {
                                tab[i]=tmp;
                                tmp=tab[j];
                                tab[j]=tab[i];
                                }
     
                fwrite(tab,sizeof(etud),l,f);
                fclose(f); 
     
                f=fopen("etudiant.dat","r");
                do
                {
     
                                           fread(&e,sizeof(etud),1,f);
                                           if(!feof(f))
                                                             printf("%s     %d \n",e.nom,e.mat);
     
                }while(!feof(f));
                fclose(f);
                getch();
                return 0;
            }
    probléme:
    en lui donnant deux étudiants après le tri il m'affiche les deux sans changement !
    vous trouvez en pièce un exemple d'exe.

    merci de m'aider !
    Images attachées Images attachées  

  2. #2
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut,

    Ton inversion de données est fausse.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tab[i]=tmp;
    tmp=tab[j];
    tab[j]=tab[i];
     
    // Devrait être
    tmp = tab[i] ;
    tab[i] = tab[j] ;
    tab[j] = tmp ;
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    merci pour votre réponses ,oui j'ai bien fait l'erreur .
    je l'ai réglé mais ça ne marche pas !
    mais lorsqu'on veut permuter deux structure, est il possible de le faire à travers
    une seule variable de type struct ou bien on fait l'échange ligne par ligne ?

    cordialement

    hindou

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    1- Evite les variables globales : c'est une habitude nuisible.
    2- Soigne la mise en forme du programme, sa clarté en dépend
    3- Ouvre les fichiers en mode binaire, ils ne sont pas structurés en lignes
    4- Utilise les constantes prédéfinies SEEK_SET,SEEK_CUR et SEEK_END dans fseek().
    5- Ne pas confondre strcpy() et strcmp() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strcpy(tab[i].nom,tab[j].nom)>0)
    6-
    mais lorsqu'on veut permuter deux structure, est il possible de le faire à travers une seule variable de type struct ou bien on fait l'échange ligne par ligne ?
    L'opération d'assignation est définie pour les structures, donc c'est possible.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    salut
    Ouvre les fichiers en mode binaire, ils ne sont pas structurés en lignes.
    qu'est ce que cela veut dire?
    4- Utilise les constantes prédéfinies SEEK_SET,SEEK_CUR et SEEK_END dans fseek().
    ca revient à utiliser des enumérations 0,1 et 2.

    oui j'ai bien rectifier strcpy par strcmp ,mais malgré tout cela le programme ne marche pas .

    a+

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hindou90 Voir le message
    salut

    qu'est ce que cela veut dire?
    C'est une habitude de programmeur Windows. Dans ce monde là, il y a une très forte différence entre "fichier texte" (lisibles par un blocnote) et "fichiers binaires" (contenant des caractères pas forcément lisibles mais qu'un programme adapté sait traiter).
    On trouve notamment dans les fichiers binaires
    - des images
    - des avi
    - des mp3
    - du .doc/.xls/.ppt
    Bref tout ce qui n'est pas ".txt" quoi.

    Et en C Windows, quand on veut traiter ce genre de fichier, il faut le spécifier de façon explicite en rajoutant un "b" dans le mode d'ouverture => fopen("toto.mp3", "rb")
    Dans ce cas, les fonctions de lecture/écriture ne font pas de traitement sur les octets lus... alors qu'elles font un certain traitement sur les octets des fichiers textes (surtout en ce qui concerne la fin de ligne)

    Toutefois cela n'a pas d'importance sous les systèmes de type unixoïdes dans lesquels tous les fichiers sont toujours considérés comme du binaire (même les fichiers textes qui ne sont que des binaires simplifiés).

    Citation Envoyé par hindou90 Voir le message
    ca revient à utiliser des enumérations 0,1 et 2.
    Aujourd'hui oui. Mais si demain la librairie change...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    salut
    en ajoutant le "b" a fopen le programme se plante à partir de la partie de l'affichage !

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Il y a un soucis majeur avec ton code. En effet, tu ne tiens compte ni de l'alignement ni du boutisme. Il n'est pas du tout recommandé de copier dans un fichier une structure à la volée (c'est-à-dire de copier tout le contenu de l'objet de type structure tel quel, byte par byte), ni d'effectuer l'opération inverse (fichier vers mémoire).

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    bonsoir

    En effet, tu ne tiens compte ni de l'alignement ni du boutisme.
    l'alignement de quoi,svp?
    Il n'est pas du tout recommandé de copier dans un fichier une structure à la volée (c'est-à-dire de copier tout le contenu de l'objet de type structure tel quel, byte par byte), ni d'effectuer l'opération inverse (fichier vers mémoire).
    il est déconseillé , mais faisable .
    pourqoui il est déconseillé ?

    merci de m'expliquer d'avantage, je serais très reconnaissante
    a+

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hindou90 Voir le message
    pourqoui il est déconseillé ?
    Parce que le compilo modifie parfois une structure. Il l'allonge un peu ou réorganise les champs à sa façon pour optimiser le code.
    Et donc si tu claques ta structure dans ton fichier en brut ou, à l'inverse, que tu récupères en brut toute ta structure à partir du fichier, ça marchera tant que tu resteras sur la même machine mais ce sera pas portable. Parce que si tu sauvegardes sur un host X et que tu veux récupérer sur un host Y sur une autre architecture, le compilo arrangera la même structure de façon un poil différente et les octets situés dans le fichier que tu veux récupérer ne seront pas dans l'ordre qu'il faut

    La sauvegarde d'une structure dans un fichier et sa récupération à partir d'un fichier doivent se faire champ par champ.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    Points : 51
    Points
    51
    Par défaut
    salut
    donc c'est d ici vient le probléme?

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2010, 22h51
  2. Lire des tags ID3 sur un fichier distant
    Par thms92 dans le forum Programmation multimédia/Jeux
    Réponses: 4
    Dernier message: 15/03/2009, 16h01
  3. Réponses: 2
    Dernier message: 19/09/2006, 21h34
  4. [Librairies] [Lire sur un fichier Word ou PDF avec PHP]
    Par amatollah dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 10/05/2006, 07h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo