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 :

Message d'erreur imcompréhensible


Sujet :

C

  1. #1
    Membre du Club Avatar de tiotel
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 75
    Points : 62
    Points
    62
    Par défaut Message d'erreur imcompréhensible
    Bonjour a tout le monde,

    j'espère que vous allez tous bien.

    Je suis actuellement en train de coder un petit programme qui fait de l'ajout d'utilisateur dans un fichier.

    J'ai terminer mon code depuis deux bonnes heures mais je me prend maintenant la tête avec des erreurs de compilations que je ne comprend pas.

    Les erreurs sont les suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    adduser.c:12: error: expected ‘=’, ‘,’, ‘;’, ‘asmor ‘__attribute__’ before ‘checkUser’
    adduser.c:71: error: expected ‘=’, ‘,’, ‘;’, ‘asmor ‘__attribute__’ before ‘checkPassword’
    adduser.c: In function ‘main’:
    adduser.c:90: error: ‘bool’ undeclared (first use in this function)
    adduser.c:90: error: (Each undeclared identifier is reported only once
    adduser.c:90: error: for each function it appears in.)
    adduser.c:90: error: expected ‘;’ before ‘verifuser’
    adduser.c:91: error: expected ‘;’ before ‘verifpassword’
    adduser.c:103: error: ‘verifuser’ undeclared (first use in this function)
    adduser.c:105: error: ‘false’ undeclared (first use in this function)
    adduser.c:111: error: ‘verifpassword’ undeclared (first use in this function)
    adduser.c:130: warning: incompatible implicit declaration of built-in function ‘strcpy’
    adduser.c:131: warning: incompatible implicit declaration of built-in function ‘strcat’
    mon code est le suivant :

    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    #define TAILLE_MAX 50;
     
    /*
    ** Fonction permettant de verifier si l'utilisateur est deja créer
    ** @Unuser : l'utilisateur à tester
    ** return true : L'utilisateur n'est pas présent
    ** return false : l'utilisateur est présent
    */
    bool checkUser(char *Unuser) 
    {
    	// on va ouvrir le fichier qui contient l'ensemble des utlisateurs
            FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
    	char chaine2 [];
     
    	//contient une ligne du fichier
    	char lignefichier[40];
     
    	  fichier = fopen("user.txt", "r+");
     
    	  if (fichier != NULL)
    	  {
    		//on va parcourir le fichier
     
    		fgets(chaine, TAILLE_MAX, fichier);
     
    		//on va separer le login du mdp
     
    		char tab[2][20];
    		int j = 0;
     
    		do
    		{
        			int k = 0;
        			while(*c != ':' && *c) tab[j][k++] = *c++;
        			tab[j++][k] = 0;
    		} while(*c++);
     
    		//on teste les deux resultats
     
    		if(!strcmp(Unuser, tab[0]))
    		{
    		    return true;
    		}
    		else
    		{
    		    return false;
    		}
     
    		fclose(fichier); // On ferme le fichier qui a été ouvert        
        	  }
              else
    	  {
    		return true;
    	  }
     
    	return false;
     
    }
     
    /*
    ** Fonction permettant de verifier la concordance des mots de passe saisis
    ** @Password : Password à tester
    ** @Cpassword : Password saisie une seconde fois
    ** return true : bonne concordance 
    ** return false : ne corresponde pas
    */
    bool checkPassword(char *Password, char *Cpassword) 
    {
     
    	if(!strcmp(Password, Cpassword))
    	{
    	    return true;
    	}
     
    	return false;
     
    }
     
     
    int main(int argc,char *argv[])
    {
    	char User[20];
    	char Password[20];
    	char Cpassword[20];
     
    	bool verifuser;
    	bool verifpassword;
     
    	//va contenir la ligne à inserer dans le fichier	
    	char ligne[50];
     
    	//saisie de l'utilisateur	
    	do
    	{
     
    	printf("Veuillez saisir l'utilisateur à créer :");
    	scanf("%s",User);
     
    	verifuser = checkUser(User);
     
    	} while (verifuser == false);
     
    	//saisie du mot de passe
    	do
    	{
     
    	verifpassword = false;
     
    	printf("Veuillez le mot de passe de l'ulisateur :");
    	scanf("%s",Password);
     
    	printf("Confirmez le mot de passe de l'ulisateur :");
    	scanf("%s",Cpassword);
     
    	verifpassword = checkPassword(Password,Cpassword);
     
    	}while(verifpassword == false);
     
    	// on va ouvrir le fichier qui contient l'ensemble des utlisateurs
    	//si celui ci n'existe pas alors on le créer
            FILE* fichier = NULL;
            fichier = fopen("user.txt", "a+");
     
     	if (fichier != NULL)
    	{
    		strcpy(ligne, User);
    		strcat(ligne,":" );
    		strcat(ligne, Password);
    		strcat(ligne, "\n");
     
    		printf("%s\n",ligne);
     
    		//on insere la ligne dans le fichier
    		fputs(ligne, fichier);
    		fclose(fichier);
    	}
    	else
    	{
    		printf("erreur dans l'ouverture de fichier \n");
    	}
     
     
     
    	return 0;
    }
    Je vous remercie par avance

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    retire le ;

    il manque la taille du tableau.

    Il manque stdbool.h.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre du Club Avatar de tiotel
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    Bonjour,

    Merci pour les infos.

    cela fonctionne parfaitement.

    Maintenant j'ai un autre petit probleme et je ne voit pas la solution.

    La premiere execution du programme fonctionne parfaitement. C'est à dire lorsqu'il créer le fichier. Ensuite lors d'une nouvelle exécution , j'ai une boucle infinie qui m'indique que mon utilisateur est deja present dans la base

    Quelqu'un aurait une idée ?

    Merci d'avance


    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdbool.h>
    #define TAILLE_MAX 50
     
    /*
    ** Fonction permettant de verifier si l'utilisateur est deja créer
    ** @Unuser : l'utilisateur à tester
    ** return true : L'utilisateur n'est pas présent
    ** return false : l'utilisateur est présent
    */
    bool checkUser(char *Unuser) 
    {
    	// on va ouvrir le fichier qui contient l'ensemble des utlisateurs
            FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
     
    	//contient une ligne du fichier
    	char lignefichier[40];
     
    	  fichier = fopen("user.txt", "r");
     
    	  if (fichier != NULL)
    	  {
    		//on va parcourir le fichier
     
    		fgets(chaine, TAILLE_MAX, fichier);
     
    		//on va separer le login du mdp
    		char *c = chaine;
    		char tab[2][20];
    		int j = 0;
     
    		do
    		{
        			int k = 0;
        			while(*c != ':' && *c) tab[j][k++] = *c++;
        			tab[j++][k] = 0;
    		} while(*c++);
     
     		printf("%s \n",tab[0]);
    		printf("%s \n",Unuser);
     
    		if(!strcmp(Unuser, tab[0]))
    		{
     
    		    return true;
    		    fclose(fichier); // On ferme le fichier qui a été ouvert  
    		}
    		else
    		{
    		    printf("L'utilisateur existe déja \n");
    		    return false;
    		    fclose(fichier); // On ferme le fichier qui a été ouvert  
    		}
     
     
        	  }
              else
    	  {
    		printf("Premier utilisateur \n");
     
    		return true;
    	  }
    }
     
    /*
    ** Fonction permettant de verifier la concordance des mots de passe saisis
    ** @Password : Password à tester
    ** @Cpassword : Password saisie une seconde fois
    ** return true : bonne concordance 
    ** return false : ne corresponde pas
    */
    bool checkPassword(char *Password, char *Cpassword) 
    {
     
    	if(!strcmp(Password, Cpassword))
    	{
    	    return true;
    	}
    	else
    	{
    	    printf("Erreur de saisie dans les mots de passes \n");
    	    return false;
    	}
     
    	return false;
     
    }
     
     
    int main(int argc,char *argv[])
    {
    	char User[20];
    	char Password[20];
    	char Cpassword[20];
     
    	bool verifuser = false;
    	bool verifpassword = false;
     
    	//va contenir la ligne à inserer dans le fichier	
    	char ligne[50];
     
    	//saisie de l'utilisateur	
    	do
    	{
     
    	printf("Veuillez saisir l'utilisateur à créer :");
    	scanf("%s",User);
     
    	verifuser = checkUser(User);
     
    	} while (verifuser == false);
     
    	//saisie du mot de passe
    	do
    	{
     
    	verifpassword = false;
     
    	printf("Veuillez le mot de passe de l'ulisateur :");
    	scanf("%s",Password);
     
    	printf("Confirmez le mot de passe de l'ulisateur :");
    	scanf("%s",Cpassword);
     
    	verifpassword = checkPassword(Password,Cpassword);
     
    	}while(verifpassword == false);
     
    	// on va ouvrir le fichier qui contient l'ensemble des utlisateurs
    	//si celui ci n'existe pas alors on le créer
            FILE* fichier = NULL;
            fichier = fopen("user.txt", "a+");
     
     	if (fichier != NULL)
    	{
    		strcpy(ligne, User);
    		strcat(ligne,":" );
    		strcat(ligne, Password);
    		strcat(ligne, "\n");
     
    		printf("%s\n",ligne);
     
    		//on insere la ligne dans le fichier
    		fputs(ligne, fichier);
    		fclose(fichier);
    	}
    	else
    	{
    		printf("erreur dans l'ouverture de fichier \n");
    	}
     
     
     
    	return 0;
    }
    .

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par tiotel Voir le message
    La premiere execution du programme fonctionne parfaitement. C'est à dire lorsqu'il créer le fichier. Ensuite lors d'une nouvelle exécution , j'ai une boucle infinie qui m'indique que mon utilisateur est deja present dans la base

    Quelqu'un aurait une idée ?
    Mauvaise utilisation de strcmp(), cette fonction retourne 0 si les deux chaînes sont identiques et un nombre non nul dans le cas contraire.

    Or dans ton code tu as écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!strcmp(Unuser, tab[0]))
    ce qui est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strcmp(Unuser, tab[0]) == 0)
    Tu retournes donc true si les chaînes sont égales et false dans le cas contraire, ce qui est exactement l'inverse de ce que tu cherches visiblement à faire.

    Un autre petit problème dans la vérification de l'existence de l'utilisateur : tu ne compares le nom du nouvel utilisateur qu'avec le no: du premier utilisateur présent dans le fichier et non avec tous les utilisateurs présent.

  5. #5
    Membre du Club Avatar de tiotel
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    Merci Gl pour cette info.

    Cela fonctionne parfaitement.

    Petite question.

    Pour parcourir l'ensemble du fichier je vais rajouter la boucle suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
    {
    }
    mais je suis septique car je ne vois pas comment cela fonctionner.

    Est ce que quelqu'un peut me dire si c'est bon ou bien, je m'egare

    Merci pour toute vos infos. On peut compter sur vous



    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
     
    /*
    ** Fonction permettant de verifier si l'utilisateur est deja créer
    ** @Unuser : l'utilisateur à tester
    ** return true : L'utilisateur n'est pas présent
    ** return false : l'utilisateur est présent
    */
    bool checkUser(char *Unuser)
    {
        // on va ouvrir le fichier qui contient l'ensemble des utlisateurs
            FILE* fichier = NULL;
        char chaine[TAILLE_MAX] = "";
     
        //va contenir le resultat du test
        bool result = false;
     
        //contient une ligne du fichier
        char lignefichier[40];
     
          fichier = fopen("user.txt", "r");
     
          if (fichier != NULL)
          {
            //on va parcourir le fichier
     
          // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
              while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
              {
     
            //on va separer le login du mdp
            char *c = chaine;
            char tab[2][20];
            int j = 0;
     
            do
            {
                    int k = 0;
                    while(*c != ':' && *c) tab[j][k++] = *c++;
                    tab[j++][k] = 0;
            } while(*c++);
     
            if(strcmp(Unuser, tab[0]))
            {
     
                return true;
     
            }
            else
            {
                printf("L'utilisateur existe déja \n");
                return false;
     
            }
           }
     
     
              }
              else
          {
            printf("Premier utilisateur \n");
            return  true;
          }
          fclose(fichier); // On ferme le fichier qui a été ouvert 
     
    }

  6. #6
    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
    Pour parcourir l'ensemble du fichier je vais rajouter la boucle suivante :
    ...mais je suis septique car je ne vois pas comment cela fonctionner.
    Est ce que quelqu'un peut me dire si c'est bon ou bien, je m'egare
    C'est correct. fgets renverra NULL à la fin du fichier (ou si il y a une erreur de lecture)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  7. #7
    Membre du Club Avatar de tiotel
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    Merci.

    Je viens de tester cela ne fonctionne pas. Est ce que c'est du fait que mon fichier est du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    luke:mara
    han:leia
    anakin:padmé
    Il faut que je test la premiere partie de la ligne avec ce que je viens de saisir

    Je suis perdu

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par tiotel Voir le message
    Merci.

    Je viens de tester cela ne fonctionne pas. Est ce que c'est du fait que mon fichier est du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    luke:mara
    han:leia
    anakin:padmé
    Non cela vient du fait que tu ne teste toujours que la première ligne de ton fichier. En effet, si le nom d'utilisateur saisi ne correspond pas à celui d la première ligne, strcmp(Unuser, tab[0]) retourne un nombre non nul et tu exécutes donc le return true;
    Il ne faut pas sortir de la fonction dans ce cas de figure.

    En outre:
    • Avec ce code, le fichier ouvert dans la fonction checkUser() n'est jamais fermé, puisqu'on sort forcément de la fonction avant l'appel à fclose().
    • Si le fichier est présent mais vide, la fonction retourne n'importe quoi (puisque fgets() retourne NULL dès le premier appel).
    • Tu ne gères pas toujours correctement les tailles de tes chaînes.
    • Pourquoi tab est-il un tableau bidimensionnel, ce n'est à priori pas utile ici.

  9. #9
    Membre du Club Avatar de tiotel
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    Merci,

    Je viens de modifier le code comme tu me l'a propose mais desormais, il m'indique que l'utilisateur existe toujours


    tu n'aurais pas une idee d'ou cela pourrais provenir

    Merci d'avance
    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
    ** Fonction permettant de verifier la concordance des mots de passe saisis
    ** @Password : Password à tester
    ** @Cpassword : Password saisie une seconde fois
    ** return true : bonne concordance
    ** return false : ne corresponde pas
    */
    bool checkPassword(char *Password, char *Cpassword)
    {
     
        if(!strcmp(Password, Cpassword))
        {
            return true;
        }
        else
        {
            printf("Erreur de saisie dans les mots de passes \n");
            return false;
        }
     
        return false;
     
    }
     
     
    int main(int argc,char *argv[])
    {
        char User[20];
        char Password[20];
        char Cpassword[20];
     
        bool verifuser = false;
        bool verifpassword = false;
     
        //va contenir la ligne à inserer dans le fichier   
        char ligne[50];
     
        //saisie de l'utilisateur   
        do
        {
     
        printf("Veuillez saisir l'utilisateur à créer :");
        scanf("%s",User);
     
        verifuser = checkUser(User);
     
        } while (verifuser == false);
     
        //saisie du mot de passe
        do
        {
     
        verifpassword = false;
     
        printf("Veuillez saisir le mot de passe du compte :");
        scanf("%s",Password);
     
        printf("Confirmez le mot de passe du compte :");
        scanf("%s",Cpassword);
     
        verifpassword = checkPassword(Password,Cpassword);
     
        }while(verifpassword == false);
     
        // on va ouvrir le fichier qui contient l'ensemble des utlisateurs
        //si celui ci n'existe pas alors on le créer
            FILE* fichier = NULL;
            fichier = fopen("user.txt", "a+");
     
         if (fichier != NULL)
        {
            strcpy(ligne, User);
            strcat(ligne,":" );
            strcat(ligne, Password);
            strcat(ligne, "\n");
     
     
            //on insere la ligne dans le fichier
            fputs(ligne, fichier);
            fclose(fichier);
        }
        else
        {
            printf("erreur dans l'ouverture de fichier \n");
        }
     
     
     
        return 0;
    }

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par tiotel Voir le message
    Je viens de modifier le code comme tu me l'a propose mais desormais, il m'indique que l'utilisateur existe toujours

    tu n'aurais pas une idee d'ou cela pourrais provenir

    Il faudrait que tu fournisses la dernière version de la fonction checkuser(). La il n'y a que checkpassword() et main()

  11. #11
    Membre du Club Avatar de tiotel
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    Salut,

    Je viens de recorriger quelques erreurs mais j'ai toujours le même problème.

    Je lance le programme pas a pas mais je ne trouve pas.

    PS : je developpe sous Débian. Mieux que sous windows pour le c

    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdbool.h>
    #define TAILLE_MAX 42
     
    /*
    ** Fonction permettant de verifier si l'utilisateur est deja créer
    ** @Unuser : l'utilisateur à tester
    ** return true : L'utilisateur n'est pas présent
    ** return false : l'utilisateur est présent
    */
    bool checkUser(char *Unuser) 
    {
    	// on va ouvrir le fichier qui contient l'ensemble des utlisateurs
            FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
     
    	//va contenir le resultat du test
    	//on part du principe que l'utilisateur n'existe pas
    	bool result;
     
    	//contient une ligne du fichier
    	char lignefichier[40];
     
    	  fichier = fopen("user.txt", "r");
     
    	  if (fichier != NULL)
    	  {
    		//on va parcourir le fichier
     
    	  // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
              while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
              {
    		//on part du principe que l'utilisateur n'existe pas
                    result = true;
     
    		//on va separer le login du mdp
    		char *c = chaine;
    		char tab[2];
    		int j = 0;
     
    		do
    		{
        			int k = 0;
        			while(*c != ':' && *c) tab[j]= *c++;
        			tab[j++]= 0;
    		} while(*c++);
     
    		//on compare ce que l'on a trouver
    		if(strcmp(Unuser, tab[0]))
    		{
    		    printf("Utilisateur existant\n");
    		   // On ferme le fichier qui a été ouvert
    		   fclose(fichier);                      
                       return false; 
    		}
    	   }
     
    	   // On ferme le fichier qui a été ouvert
    	   fclose(fichier);
    	   return true;
     
              }
              else
    	  {
    		printf("Premier utilisateur \n");
    		return true;
    	  }   
    }
     
    /*
    ** Fonction permettant de verifier la concordance des mots de passe saisis
    ** @Password : Password à tester
    ** @Cpassword : Password saisie une seconde fois
    ** return true : bonne concordance 
    ** return false : ne corresponde pas
    */
    bool checkPassword(char *Password, char *Cpassword) 
    {
     
    	if(!strcmp(Password, Cpassword))
    	{
    	    return true;
    	}
    	else
    	{
    	    printf("Erreur de saisie dans les mots de passes \n");
    	    return false;
    	}
     
    	return false;
     
    }
     
     
    int main(int argc,char *argv[])
    {
    	char User[20];
    	char Password[20];
    	char Cpassword[20];
     
    	bool verifuser = false;
    	bool verifpassword = false;
     
    	//va contenir la ligne à inserer dans le fichier	
    	char ligne[50];
     
    	//saisie de l'utilisateur	
    	do
    	{
     
    	printf("Veuillez saisir l'utilisateur à créer :");
    	scanf("%s",User);
     
    	verifuser = checkUser(User);
     
    	} while (verifuser == false);
     
    	//saisie du mot de passe
    	do
    	{
     
    	verifpassword = false;
     
    	printf("Veuillez saisir le mot de passe du compte :");
    	scanf("%s",Password);
     
    	printf("Confirmez le mot de passe du compte :");
    	scanf("%s",Cpassword);
     
    	verifpassword = checkPassword(Password,Cpassword);
     
    	}while(verifpassword == false);
     
    	// on va ouvrir le fichier qui contient l'ensemble des utlisateurs
    	//si celui ci n'existe pas alors on le créer
            FILE* fichier = NULL;
            fichier = fopen("user.txt", "a+");
     
     	if (fichier != NULL)
    	{
    		strcpy(ligne, User);
    		strcat(ligne,":" );
    		strcat(ligne, Password);
    		strcat(ligne, "\n");
     
     
    		//on insere la ligne dans le fichier
    		fputs(ligne, fichier);
    		fclose(fichier);
    	}
    	else
    	{
    		printf("erreur dans l'ouverture de fichier \n");
    	}
     
     
     
    	return 0;
    }

  12. #12
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par tiotel Voir le message
    Salut,

    Je viens de recorriger quelques erreurs mais j'ai toujours le même problème.

    Je lance le programme pas a pas mais je ne trouve pas.
    En vrac:

    • Tu as refait la même erreur sur strcmp(), strcmp() retourne 0 si les chaînes sont identiques et un nombre non nul dans le cas contraire. or ici tu considères que l'utilisateur existe déjà si les chaînes sont différentes. Au passage, si tu n'es pas trop à l'aise avec les comparaisons, il serait peut être préférable d'écrire le test complètement, soit if(strcmp(Unuser, tab[0]) != 0) plutôt que if(strcmp(Unuser, tab[0])).
    • La taille de tab est insuffisante pour contenir le nom d'utilisateur puisque tu permets de saisir jusqu'à 20 caractères.
    • Dans la boucle qui récupère le nom depuis une ligne lue dans le fichier, j n'est jamais incrémenté. Tous les caractères, y compris le \0 terminal, sont écrit à l'indice 0 du tableau, au final tu as donc une chaîne vide.
    • if(strcmp(Unuser, tab[0])) est faux et ne compile pas, en effet tab[0] est un char or strcmp attends un char*.
    • TAILLE_MAX est inssuffisante, en effet fgets() lit également le \n, la chaîne lue peut donc faire jusqu'à 42 caractères plus le '\0', il faudrait que TAILLE_MAX ait une taille au moins égale à 43 pour être cohérent.
    • Ca manque de contrôle sur les tailles. Même si, ça ne semble pas nécessaire dans un premier temps vu que toutes les tailles se contraigne les une les autres, c'est assez dangereux car d'une part le fichier texte peut être modifié en dehors du programme et d'autre part tu as une probabilité élevé d'oublier un cas lors d'une évolution.
    • Pourquoi utilises-tu un define pour la taille de la ligne à lire et pas pour les autres tableaux ? D'autant que TAILLE_MAX devrait justement être déduites des autres tailles.
    • Tu devrais éviter d'utiliser scanf() qui est assez complexe à utiliser correctement. Typiquement l'usage que tu en fait ici (scanf("%s",Cpassword) est faux.


    Il y a peut être d'autres soucis, mais c'est ce qui m'a sauté aux yeux en faisant une lecture rapide.

  13. #13
    Membre du Club Avatar de tiotel
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    Merci pour ses idées.

    Je les ai implémentée mais toujours le même problème.

    Je pense que mon problème vient du split de la chaine de caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    do
    		{
        			int k = 0;
        			while(*c != ':' && *c) tab[j][k++] = *c++;
        			tab[j++][k] = 0;
    		} while(*c++);
    Je ne comprend pas d'es que j'execute mon programme cela me donne cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TARIS:/home/lionel/projet# gcc adduser.c -o adduser.out
    TARIS:/home/lionel/projet# ./adduser.out
    Veuillez saisir l'utilisateur à créer :ff
    Contenu de tab[0] : luc
    Utilisateur existant

    Je crois que je vais peter un cable.

    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
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdbool.h>
    #define TAILLE_MAX 43
     
    /*
    ** Fonction permettant de verifier si l'utilisateur est deja créer
    ** @Unuser : l'utilisateur à tester
    ** return true : L'utilisateur n'est pas présent
    ** return false : l'utilisateur est présent
    */
    bool checkUser(char *Unuser) 
    {
    	// on va ouvrir le fichier qui contient l'ensemble des utlisateurs
            FILE* fichier = NULL;
    	char chaine[TAILLE_MAX] = "";
     
    	//va contenir le resultat du test
    	bool result;
     
    	//contient une ligne du fichier
    	char lignefichier[40];
     
    	  fichier = fopen("user.txt", "r");
     
    	  if (fichier != NULL)
    	  {
    		//on va parcourir le fichier
     
    	  // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
              while (fgets(chaine, TAILLE_MAX, fichier) != NULL) 
              {
    		//on part du principe que l'utilisateur n'existe pas
                    result = true;
     
    		//on va separer le login du mdp
    		char *c = chaine;
    		char tab[2][20];
    		int j = 0;
     
    		do
    		{
        			int k = 0;
        			while(*c != ':' && *c) tab[j][k++] = *c++;
        			tab[j++][k] = 0;
    		} while(*c++);
     
    		printf("%s\n",tab[0]);
     
    		//on compare ce que l'on a trouver
    		if(strcmp(Unuser, tab[0])==0)
    		{
    		   // On ferme le fichier qui a été ouvert
    		   fclose(fichier);                      
                       return true; 
    		}
    		else
    		{
    		    printf("Utilisateur existant\n");
    		   // On ferme le fichier qui a été ouvert
    		   fclose(fichier);                      
                       return false;
    		}
    	   }
     
    	   // On ferme le fichier qui a été ouvert
    	   fclose(fichier);
    	   return true;
     
              }
              else
    	  {
    		printf("Premier utilisateur \n");
    		return true;
    	  }   
    }
     
    /*
    ** Fonction permettant de verifier la concordance des mots de passe saisis
    ** @Password : Password à tester
    ** @Cpassword : Password saisie une seconde fois
    ** return true : bonne concordance 
    ** return false : ne corresponde pas
    */
    bool checkPassword(char *Password, char *Cpassword) 
    {
     
    	if(!strcmp(Password, Cpassword))
    	{
    	    return true;
    	}
    	else
    	{
    	    printf("Erreur de saisie dans les mots de passes \n");
    	    return false;
    	}
     
    	return false;
     
    }
     
     
    int main(int argc,char *argv[])
    {
    	char User[20];
    	char Password[20];
    	char Cpassword[20];
     
    	bool verifuser = false;
    	bool verifpassword = false;
     
    	//va contenir la ligne à inserer dans le fichier	
    	char ligne[50];
     
    	//saisie de l'utilisateur	
    	do
    	{
     
    	printf("Veuillez saisir l'utilisateur à créer :");
    	scanf("%s",User);
     
    	verifuser = checkUser(User);
     
    	} while (verifuser == false);
     
    	//saisie du mot de passe
    	do
    	{
     
    	verifpassword = false;
     
    	printf("Veuillez saisir le mot de passe du compte :");
    	scanf("%s",Password);
     
    	printf("Confirmez le mot de passe du compte :");
    	scanf("%s",Cpassword);
     
    	verifpassword = checkPassword(Password,Cpassword);
     
    	}while(verifpassword == false);
     
    	// on va ouvrir le fichier qui contient l'ensemble des utlisateurs
    	//si celui ci n'existe pas alors on le créer
            FILE* fichier = NULL;
            fichier = fopen("user.txt", "a+");
     
     	if (fichier != NULL)
    	{
    		strcpy(ligne, User);
    		strcat(ligne,":" );
    		strcat(ligne, Password);
    		strcat(ligne, "\n");
     
     
    		//on insere la ligne dans le fichier
    		fputs(ligne, fichier);
    		fclose(fichier);
    	}
    	else
    	{
    		printf("erreur dans l'ouverture de fichier \n");
    	}
     
     
     
    	return 0;
    }

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par tiotel Voir le message
    Merci pour ses idées.

    Je les ai implémentée mais toujours le même problème.
    Non tu ne les as pas toutes implémentées, seulement certaines et tu es revenu en arrière sur certains points en ré-introduisant les précédents problèmes (dont l'arrêt après la première ligne).

    En outre, tu as toujours le problème sur strcmp(), tu as certes changé la condition mais tu as également modifié le corps du if et du else, ce qui ne peut pas résoudre le problème.

    Avec ton code ci-dessous :

    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
     
    //on compare ce que l'on a trouver
    if(strcmp(Unuser, tab[0])==0)
    {
       // On ferme le fichier qui a été ouvert
       fclose(fichier);                      
       return true; 
    }
    else
    {
        printf("Utilisateur existant\n");
       // On ferme le fichier qui a été ouvert
       fclose(fichier);                      
       return false;
    }
    si les deux chaînes sont identiques tu passes dans le if, si les chaînes sont différentes tu passes dans le else. Ainsi tu affiche que l'utilisateur existe déjà s'il ne correspond pas à celui présent dans le fichier e réciproquement.

  15. #15
    Membre du Club Avatar de tiotel
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    Salut,

    apres avoir passé encore une bonne parie de la soirée, je ne vois absoluement pas comment tourner mon if pour que cela fonctionne.

    J'ai bien compris le principe que tu m'expose mais je ne vois pas du tout comment l'impleter et c'est grave.

    Est ce que tu pourrais me donner quelque idée ?

    Merci d'avance

  16. #16
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par tiotel Voir le message
    J'ai bien compris le principe que tu m'expose mais je ne vois pas du tout comment l'impleter et c'est grave.

    Est ce que tu pourrais me donner quelque idée ?
    En revenant sur le code précédent et non le dernier,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //on compare ce que l'on a trouver
    if(strcmp(Unuser, tab[0]) == 0)
    {
       printf("Utilisateur existant\n");
       // On ferme le fichier qui a été ouvert
       fclose(fichier);                      
       return false; 
    }
    devrait fonctionner. A condition bien entendu de corriger les autres problèmes signalés, notamment la taill de tab et l'incrément de j.

    PS : sinon pour revenir à ma remarque sur la valeur de TAILLE_MAX, je n'étais pas bien réveillé visiblement, la taille du login et du password étant de 19 caractères utiles, il n'était pas utile de monter la valeur de TAILLE_MAX à 43.

Discussions similaires

  1. [TSocket] Message d'erreur
    Par rgz dans le forum Web & réseau
    Réponses: 6
    Dernier message: 04/07/2003, 09h16
  2. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  3. Réponses: 4
    Dernier message: 04/03/2003, 01h05
  4. [CR] Message d'erreur
    Par nono1 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/09/2002, 14h54
  5. Réponses: 2
    Dernier message: 27/05/2002, 19h46

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