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 :

Fichiers en accés direct , détection d'erreur défaillante


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut Fichiers en accés direct , détection d'erreur défaillante
    Salut à tous,

    voilà je fais un programme de gestion d'élève avec fichier en accés direct, j'ai mis des détecteurs d'erreurs dans mon programme pour détecter si le numéro d'élève entré est utilisé ou non...
    Mais ils ne fonctionnent pas...

    voici mon code :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    void creation()
     
    	{
    		// Variables
    		int NbEleve;
    		char rep;
    		int i;
    		int TestEcriture;
    		int TestPointeur;
    		int TestLecture;
     
    		// Ici l'utilisateur va créer et donner un nom au fichier qu'il désire utiliser
     
     
     
    		system("cls");
    		printf("*** Creation du fichier *** \n\n");
     
    		printf("Entrez le nom du fichier que vous souhaitez créer : \n");
    		scanf("%s",&nomfich);
     
     
     
    		printf("Entrez le nombre d'eleve ? \n ");
    		scanf("%i",&NbEleve);
     
    		InitFichier(NbEleve);
     
    		FILE*Repertoire;
     
    		Repertoire=fopen(nomfich,"r+");
     
    		do
    		{
     
    				printf("\n Donnez le numero, UNIQUE, de l'eleve : \n");
    				scanf("%i",&eleve.numero);
     
     
     
    				// Positionnement à l'enregistrement concernant le numéro entré
     
    				TestPointeur=fseek(Repertoire,sizeof(elev)*(eleve.numero-1),SEEK_SET); // fseek renvoie 0 si le positionnement s'est bien déroulé
     
     
     
     
    				TestLecture=fread (&eleve, sizeof(elev), 1,Repertoire) ;
     
     
     
    				if(TestPointeur==0 && TestLecture==1)
    				{	
    					if(eleve.valide==true)
    					{
    					printf("Entrez le nom de l'eleve : \n\n ");
    					scanf("%s",&eleve.nom);
     
    					printf("Entrez son prenom : \n\n");
    					scanf("%s",&eleve.prenom);
     
    					eleve.moyenne=0;
    					eleve.valide=false;
     
    					//Initialisation du tableau des notes
     
    					for(i=0;i<5;i++)
    					{
    						eleve.note[i]=0;
    					}
     
    					}
    					else
    					{
    						printf("Erreur le numero UNIQUE entre est deja en cours d'utilisation");
    						rep=='o';
    					}
     
    					//recule au début de l'enregistrement puisqu'on la lu auparavent
    					fseek(Repertoire,-sizeof(elev),SEEK_SET);
     
    					TestEcriture=fwrite(&eleve,sizeof(elev),1,Repertoire); // Fwrite renvoie une valeur négative en cas d'erreur
    					// En cas de manque d'espace disque
     
    					if(TestEcriture<0)
    					{
    						printf("\n Erreur lors de l ecriture dans le fichier, Code Erreur 3");
    						fclose (Repertoire);
    						main();
     
    					}
     
     
    				}
     
    				else
     
    				{
    					printf(" \n Erreur lors du positionnement du pointeur \n notez le code erreur 2");
    					getch();
    					rep='o';
     
    				}
     
     
     
     
     
    			printf(" \n Saisie d'un eleve ? (o/n) \n");
    			rep=getch();
     
    		}while(rep=='o');
     
    		fclose(Repertoire);
     
    		main();
     
     
    	}
    Merci

  2. #2
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Ouaille.... Tu n'as pas du lire les precedents topics avant de poster....

    Tu utilise scanf() pour des saisies utilisateur... Tu va te faire allumer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    scanf("%i",&NbEleve);
    Que se passe-t-il si je tape "bougabouga" ?
    utlise plutot fgets(), plus approprie pour ce genre de choses. scanf() est utilisable quand l'entree est formatee.

    Et encore une chose :
    C'est quoi ca :
    Tout a la fin de ton code ??

    <edit>tu devrais faire des fonctions encore plus longues c'est un vrai plaisir de mettre son nez dedans</edit>
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    pour le scanf, notre prof nous a dit de faire comme ça...

    le main renvoie à une fonction menu.

    je sais que mon code est loin d'être parfait, je fais mes débuts en C

  4. #4
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    pour le scanf, notre prof nous a dit de faire comme ça...
    comme beaucoup (trop) de prof...
    il y a du linge sur la corde à linge

  5. #5
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Deejoh
    pour le scanf, notre prof nous a dit de faire comme ça...
    Aie... Demande a ton prof ce qui se passe si tu tape de la merde sur ton clavier.
    Citation Envoyé par Deejoh
    le main renvoie à une fonction menu.
    Tu pourrais detailler un peu ?
    De memoire, le main() est un nom de fonction reserve en C il me semble... il n'a pas sa place dans une fonction.
    Citation Envoyé par Deejoh
    je sais que mon code est loin d'être parfait, je fais mes débuts en C
    Aucun probleme. Si tu le reconnais et que tu accepte de faire ce qu'il faut pour l'ameliorer, tout ira bien.

    Je sors quelques erreurs en vrac (vu que ce que tu as poste n'est pas compilable)

    Rajoute un espace ca devrait respirer un peu mieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    printf();
    fopen();
    scanf();
    fread();
    etc...
    J'espere que tu fais les bon includes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    scanf("%s",&nomfich);
    nomfich inconnu au bataillon.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     if(eleve.valide==true)
    ...
    eleve.valide=false;
    Fais gaffe true et false en C ca marche pas... sauf si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define TRUE     1
    #define FALSE    0
    C'est tout ce a quoi je pense pour l'instant.

    Tu pourrais preciser ce qui merde ? Que te dis ton compilo ?
    Ou ca coince ? etc...
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  6. #6
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    c'est quoi la définition de la structure elev ?

    le main renvoie à une fonction menu.
    non, on ne rappelle pas la fonction main
    il y a du linge sur la corde à linge

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    La compilation , l'execution du prog se passent trés bien

    J'ai du mal en fait à faire en sorte que le numéro d'élève rentré ne soit pas déjà utilisé car dans ce cas l'élève est effacé du fichier.

    J'aimerai que le programme vérifie celà (surement à l'aide du booléen...)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    Voici mes variables :

    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
     
     
    // Déclaration des variables
     
     
    char nomfich[81]; // nom du fichier pas plus de 80 charactère
     
    // Structure
    struct elev
    	{
    		int numero;  //numéro d'incrémentation du fichier direct
    		char nom [26];
    		char prenom[26];
    		char email[26];
    		float note[5];
    		float moyenne;
    		bool valide;
     
    	}eleve;
    [/quote]

  9. #9
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Tu pourrais poster Initfichier() ? Le probleme vient peut etre de la.

    Sinon penses a faire les modifications proposees plus haut.

    Tiens encore une en passant:
    J'ai dit de lui rajouter un espace, j'ai omis de mentionner le fait qu'on definit ses variable au sommet de son bloc.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    Voici mon initfichier :

    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
     
     
    void InitFichier(int NbEleve)
     
    {
    	int i;
     
    	FILE*Repertoire;
     
    	Repertoire=fopen(nomfich,"w+");
    	printf("\n nom fichier : %s ", nomfich);
     
    	if(Repertoire==NULL)
    	{
    		printf("\n Erreur dans l'ouverture du fichier,ce nom existe déjà");
    		printf("\n Notez le code erreur 1");
    		fclose(Repertoire);
     
    	}
    	else
    	{
    		strcpy(eleve.nom,""); // copie "" dans eleve.nom
    		strcpy(eleve.prenom,"");
    		strcpy(eleve.email,"");
    		eleve.valide=true;
     
    		// Initialisation des notes
    		for(i=0;i<5;i++)
    		{
    			eleve.note[i]=0;
    		}
     
    		for(i=0;i<NbEleve+10;i++)
    		{
    			fwrite(&eleve,sizeof(elev),1,Repertoire);
     
    		}
    		fclose(Repertoire);
     
    	}
     
    }
    En passant merci pour votre aide

  11. #11
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Deejoh
    Voici mes variables :

    Ca existe en C ca?

    Types de base C et C++
    http://www.developpez.com/c/megacours/x224.html
    Ce serait pas une C++rie par le plus grand des hazards ?
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    En ajoutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define TRUE     1 
    #define FALSE    0
    comme l'a dit la drogue c'est mal ?

  13. #13
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Alors :

    Citation Envoyé par Deejoh
    Voici mon initfichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	if(Repertoire==NULL)
    	{
    		printf("\n Erreur dans l'ouverture du fichier,ce nom existe déjà");
    		printf("\n Notez le code erreur 1");
    		fclose(Repertoire);
    	}
    Attention a tes messages d'erreurs. Ya plein de moyen de faire se planter un fopen().

    Citation Envoyé par Deejoh
    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
     
    	else
    	{
    		strcpy(eleve.nom,""); // copie "" dans eleve.nom
    		strcpy(eleve.prenom,"");
    		strcpy(eleve.email,"");
    		eleve.valide=true;
     
    		// Initialisation des notes
    		for(i=0;i<5;i++)
    		{
    			eleve.note[i]=0;
    		}
     
    		for(i=0;i<NbEleve+10;i++)
    		{
    			fwrite(&eleve,sizeof(elev),1,Repertoire);
     
    		}
    		fclose(Repertoire);
     
    	}
     
    }
    Et... il est defini ou l'eleve en question ?

    Je peux savoir un truc ? Tu compile avec quoi et comment et sur quoi ?
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    je compile sous visual studio 6

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    l'élève est une structure .

  16. #16
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Deejoh
    En ajoutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define TRUE     1 
    #define FALSE    0
    comme l'a dit la drogue c'est mal ?
    Le type bool n'existe pas en C. C'est du C++.

    En C tu peux "creer" le type booleen avec une super ruse de derriere les fagots, en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define TRUE   1
    #define FALSE  0
    Mais le type bool n'existera toujours pas.
    Par contre tu pourras faire :

    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
     
    #define TRUE	1
    #define FALSE	0
     
    #include <stdio.h>
     
    int		main(void)
    {
      int		my_sweet_bool;
     
      /*  Many things can append to my_sweet_bool here */
      if (my_sweet_bool == FALSE)
        printf("False\n");
      else
        printf("True\n");
      return (0);
    }
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    dans ce cas là ça me met une erreur à chaque fois comme quoi le numéro est déjà utilisé.

    Si j'inverse les true et le false ça ne détecte plu d'eerue :

  18. #18
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Deejoh
    dans ce cas là ça me met une erreur à chaque fois comme quoi le numéro est déjà utilisé.

    Si j'inverse les true et le false ça ne détecte plu d'eerue :
    eerue ? Joli mot...

    Ton prof t'a pas prevenu que le C c'etait magique ?
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 91
    Points : 41
    Points
    41
    Par défaut
    Pas besoin on l'avait déjà vu

    Enfin pas de solution alternative d'aprés toi ?

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Deejoh
    pour le scanf, notre prof nous a dit de faire comme ça...
    Il pourrait au moins vous expliquer comment utiliser correctement scanf(). Mais le sait-il ?

    Pour ta formation générale :

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Trier alphabetiquement un fichier a acces direct
    Par rolby65 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/07/2013, 18h50
  2. gestion fichiers en accés direct
    Par gaston11 dans le forum Débuter
    Réponses: 4
    Dernier message: 27/01/2013, 23h11
  3. Fichier en acces direct
    Par DaganaudN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/05/2008, 11h19
  4. Fichier en accès direct
    Par gelam dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 09/11/2006, 16h57
  5. Réponses: 5
    Dernier message: 02/10/2006, 22h54

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