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 :

Plantage à l'ouverture d'un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Plantage à l'ouverture d'un fichier
    Bonjour,

    J'ai regardé cette vidéo pour apprendre les fichiers en langage C :



    J'ai écrit le code en suivant la vidéo pas à pas. Hélas quand je lance le code, après avoir entré le nombre d’étudiants et le nom du premier étudiant, un message d'erreur apparaît comme quoi le programme *.exe a cessé de fonctionner alors que dans la vidéo, le code marche.

    j'ai essayé de refaire le code sous devc++ comme dans la vidéo et ça marche pas .$

    Qui peux me dire où trouver l'erreur?

    Merci.




    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
    1
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    struct etudiant
    {
        char nom[30];
        char prenom[30];
        int age;
        char sex[2];
    };
     
     
     
    int main()
    {
        char mon_fichier[]="C:\\test.text";
        FILE * fichier;
        int i,n;
        struct etudiant *p;
        struct etudiant t[100];
     
        fichier = fopen(mon_fichier,"w");
        printf("Entrez le nombre d' etudiants : ");
        scanf("%d",&n);
        for(i=0; i<n; i++)
        {
            printf("etudiants numero %d",i+1);
            printf("Entrez le nom de cet etudiant");
            scanf("%s",&(*p).nom);
            printf("Entrez le prenom de cet etudiant ");
            scanf("%s",&(*p).prenom);
            printf("Entrez l'age de cet etudiant ");
            scanf("%d",&(*p).age);
            printf("Entrez le sexe de  cet edutiant  H pour homme F pour femme ");
            scanf("%s",&(*p).sex);
            fprintf(fichier," %s\n%s\n%d\n%s\n ",(*p).nom,(*p).prenom, (*p).age,(*p).sex   );
            fclose(fichier);
     
        }
     
     
     
     
     
     
     
     
     
     
     
        return 0;
    }
    Dernière modification par Obsidian ; 03/07/2013 à 13h06. Motif: Titre + formules de politesse + quelques fautes.

  2. #2
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bonjour,

    Son exemple n'est pas censé compiler, il y a anguille sous roche . Ça devrait crash sur :
    N'as tu pas oublié un :
    juste avant d'utiliser le pointeur p? car la il ne pointe sur aucune valeur. Avant de l'utiliser tu dois le faire pointer sur quelque chose sinon tu auras un crash.
    Une autre façon sans le pointeur est de remplacer tout tes " &(*p) " par " &t[i] "
    Ça te fait écrire directement dans le tableau au lieu de passer par le pointeur. Essaye donc ça avant d'utiliser le pointeur puis passe par le pointeur pour comprendre le fonctionnement.

    EDIT: ca fait longtemps que j'ai pas fais de C mais ça -> je trouve ça bizarre... mais comme je dis le C c'est trop loin pour moi

  3. #3
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Une autre remarque. Fais très attention à ce que tu trouves sur le net pour apprendre le langage C/C++ il y a beaucoup de mer*e comme ce genre de vidéo
    Je te conseil plus les cours de C et c++ du site ici.

  4. #4
    Invité
    Invité(e)
    Par défaut
    merci de vos réponses

  5. #5
    Candidat au Club
    Homme Profil pro
    lnagage c
    Inscrit en
    Juin 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : lnagage c
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2013
    Messages : 3
    Par défaut
    bonjour

    tu doit cree cette fichier text.text dans C:\\test.text
    pour quel marche


    et merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Merci mais quand je teste le code le fichier est créé.
    Dernière modification par Invité ; 03/07/2013 à 15h33. Motif: Citation inutile du message précédent

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Comme on te l'a dit, le pointeur p ne pointe sur rien. Or il faut le faire pointer sur l'élément t[i] pour que le remplissage de p se répercute dans t[i]
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i=0, p=t; i < 100; i++, p++)

    Ensuite, (*p).xxx se raccourci en p->xxx mais c'est la même chose donc pas de souci (hormis une certaine lourdeur d'écriture). Toutefois pas de "&" pour les saisies de chaines car une chaine est déjà un pointeur
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    printf("Entrez le nom de cet etudiant");
    scanf("%s",(*p).nom);
    printf("Entrez le prenom de cet etudiant ");
    scanf("%s",p->prenom);

    Et enfin le fclose(). Trouves-tu judicieux de fermer le fichier dans la boucle ???

    Remarques annexes:
    1) peut-on avoir un age négatif ou supérieur à 65535 ?
    2) a-t-on vraiment besoin d'une chaine pour stocker le sexe (1 lettre) ?
    3) le scanf() pour faire saisir des éléments c'est pas une bonne idée car scanf() attend une saisie "formatée" et ce que tape un humain est tout sauf formaté. Que se passe-t-il si on rentre "toto" là où il demande l'age ou le sexe ?
    Malheureusement le niveau de connaissances d'un débutant ne permet pas de lui montrer autre chose (au début)

    Donc bon les vidéos c'est bien, c'est moderne, c'est très XXI° siècle mais pour apprendre un langage c'est peut-être pas le format le plus approprié. Surtout quand en plus celui qui met la vidéo en ligne n'a pas beaucoup plus de connaissances que ceux à qui elle s'adresse (toutefois lui il a bien placé le fclose)

    J'ai retapé ton code dans l'espoir que cela te donnera l'envie d'apprendre plus sérieusement. J'ai pas testé mais je ne pense pas avoir fait d'erreur.
    Code c : 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
    #include <stdio.h>
    #include <stdlib.h>
     
    struct s_etudiant
    {
        char nom[30];
        char prenom[30];
        unsigned short age;
        char sex;
    } 
     
    int main()
    {
        char mon_fichier[]="C:\\test.text";
        FILE *fichier;
        unsigned short i,n;
        struct s_etudiant *p;
        struct s_etudiant t[100];
        char saisie[100];
     
        fichier = fopen(mon_fichier,"w");
        while (1)
        {
            printf("Entrez le nombre d' etudiants (jusqu'à 100): "); fflush(stdout);
            fgets(saisie, 100, stdin);
            if (sscanf(saisie, "%hu", &n) == 1 && n >0 && n < 100) break;
            printf("Saisie incorrecte - recommencez\n");
        }
     
        for(i=0, p=t; i<n; i++, p++)
        {
            printf("\netudiant numero %hu\n",i+1);
            printf("Entrez le nom de cet etudiant"); fflush(stdout);
            fgets(p->nom, 30, stdin);
            printf("Entrez le prenom de cet etudiant "); fflush(stdout);
            fgets(p->prenom, 30, stdin);
            while (1)
            {
                printf("Entrez l'age de cet etudiant "); fflush(stdout);
                fgets(saisie, 100, stdin);
                if (sscanf(saisie, "%hu", &p->age) == 1) break;
                printf("Saisie incorrecte - recommencez\n");
            }
     
            while (1)
            {
                printf("Entrez le sexe de  cet edutiant  H pour homme F pour femme "); fflush(stdout);
                fgets(saisie, 100, stdin);
                if (sscanf(saisie, "%c", &p->sex) == 1 && (p->sex == 'H' || p->sex == 'F')) break;
                printf("Saisie incorrecte - recommencez\n");
            }
     
            fprintf(fichier," %s\n%s\n%hu\n%c\n ", p->nom, p->prenom, p->age, p->sex);
        }
        fclose(fichier);
     
        return 0;
    }
    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]

  8. #8
    Invité
    Invité(e)
    Par défaut
    merci beaucoup Sve@r

    je debute en langage c et j'apprend beaucoup de choses

  9. #9
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Juste une petite parenthèse, on déconseille d'utiliser l'IDE que tu utilises : devC++.

    Sinon, quand tu as une erreur de ce genre, il faut que tu lance ton programme dans le débogueur pour avoir un vrai message d'erreur et la ligne où s'est produite l'erreur.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Bonjour,

    Juste une petite parenthèse, on déconseille d'utiliser l'IDE que tu utilises : devC++.

    Sinon, quand tu as une erreur de ce genre, il faut que tu lance ton programme dans le débogueur pour avoir un vrai message d'erreur et la ligne où s'est produite l'erreur.
    j'utilise CODEBLOCKS

Discussions similaires

  1. Ouverture d'un fichier excel predefini
    Par nberthonneau dans le forum Access
    Réponses: 10
    Dernier message: 13/06/2007, 22h14
  2. Plantage excel à l'ouverture d'un fichier
    Par seb94 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/09/2006, 12h25
  3. plantage de qlqs secondes lors de l'ouverture d'un fichier
    Par princetn dans le forum Windows XP
    Réponses: 6
    Dernier message: 28/02/2006, 12h48
  4. Réponses: 5
    Dernier message: 27/07/2004, 17h04
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

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