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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    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 émérite
    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 : 55
    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
    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 ;

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    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 confirmé
    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
    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.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 128
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    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 832
    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]

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