Probleme d'execution de mon programme en c sur code blocks

Fermé
salw2017 Messages postés 1 Date d'inscription vendredi 3 novembre 2017 Statut Membre Dernière intervention 3 novembre 2017 - Modifié le 5 nov. 2017 à 18:14
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 5 nov. 2017 à 18:31
Bonjour à tous !!

Merci d'avance pour votre écoute. J'ai un petit souci avec mon programme en c sur code blocks qui consiste à créer une liste d'étudiant avec les informations reliés à chaque étudiant (Nom, prénoms, date de naissance, institut).

La compilation est parfaite mais lorsque j'execute le programme en C, après la saisie du nom de l'institut, le programme windows plante (Windows a cessé de fonctionner).

Pourriez vous m'aider ?

Voici le code source :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int jj,mm,aa;
} date;

struct etudiant {
    int numero[4];
    char nom[20];
    char prenoms[20];
    date date_nai;
    char institut[20];
    char sexe;
};

int choix;

void main() {
    char etudiant;
    char e;
    FILE*x;
    char reponse;

case1:
    {
        x = fopen("etudiant.dat","w");
        do {
            int numero;
            char nom;
            char prenoms;
            char institut;
            int jour;
            char mois;
            int annee;
            char sexe;

            printf("entrer le numero de l'etudiant:\n");
            scanf("%d",&numero);
            printf("entrer le nom de l'etudiant:\n");
            scanf("%s",&nom);
            printf("entrer le prénoms de l'etudiant:\n");
            scanf("%s",&prenoms);
            printf("entrer la date de naissance de l'etudiant;(jour,mois,annee):\n");
            scanf("%d%d%d",&jour,&mois,&annee);
            printf("entrer le nom de l'institut:\n");
            scanf("%s",institut);
            printf("entrer le sexe:\n");
            scanf("%s",sexe);
            printf("\n autre saisie? o/n");
            reponse=getche();
        } while (reponse == 'o');

        fclose(x);
        printf("les enregistrements saisie sont:");

        x = fopen("etudiant.dat", "r");
        fread(&e, sizeof(x), 1, x);
        while (!feof(x)) {
            fclose(x);
            getch();
        }
        return;
    }
}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
A voir également:

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
5 nov. 2017 à 18:31
Bonjour,

De nombreuses choses sont incorrectes :
-
getche
et
getch
ne sont pas des fonctions standards (ça compile sous windows, mais pas sous linux). Je t'invite à plutôt utiliser
scanf

- Tu ne peux pas stocker une chaîne de caractère dans un caractère. C'est pourtant ce que tu écris ici
scanf("%s",&nom);
puisque
nom
est de type
char
.

Pour apprendre à lire / écrire des chaînes de caractère je t'invite à lire ceci :
https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/15765-les-chaines-de-caracteres

Voici un exemple minimal :

#include <stdio.h>

int main() {
char chaine[100];
printf("chaine ? ");
scanf("%s", chaine);
printf("chaine = %s\n", chaine);
return 0;
}

-
case1
désigne ici un label (utilisable avec
goto
). Comme il n'y a pas de
goto
, il ne sert à rien. En tout cas rien à voir avec
switch
qui s'écrirait comme ceci :

int i = 0
switch (i) {
  case 0:
    //...
    break;
  case 1:
    //...
    break;
  default:
    // ...
    break;
}


- ta fonction
main
est sensée finir par un
return 0
(la valeur 0 signifie que le programme a fini avec succès, on écrit aussi parfoit
EXIT_SUCCESS
).

- il faut contrôler que le fichier est ouvert (et ne le fermer que dans ce cas). Voici à quoi ça ressemble :

const char * filename = "mon_fichier.txt";
FILE * fp = fopen(filename, "w");
if (fp) {
  fprintf(fp, "mon texte");
  // ...
  fclose(fp);
} else {
  fprintf(stderr, "Cannot open %s", filename);
}


Note que tu peux lire un fichier texte comme tu le ferais avec l'entrée standard (
stdin
). En effet
scanf(...)
revient à faire
fscanf(stdin, ...)
. En particulier tu peux très bien lire un entier comme suit :

const char * filename = "mon_fichier.txt";
FILE * fp = fopen(filename, "r");
int i;
if (fp) {
  fscanf(fp, "%d", &i);
  fclose(fp);
} else {
  fprintf(stderr, "Cannot open %s", filename);
}


Utiliser
fread
revient à lire le contenu du fichier comme s'il s'agissait d'un fichier binaire. Vu que tu sembles découvrir le C, je pense que ce sera plus facile pour toi de manipuler un format texte quitte à le lire ensuite ligne par ligne avec
getline
.

- Pour le moment, la saisie n'est pas enregistrée dans le fichier
etudiant.dat
. La lecture qui s'ensuit ne marchera donc pas.

Bonne chance
0