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 :

écrire dans un fichier (POSIX)


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut écrire dans un fichier (POSIX)
    Bonjour, je suis en train d'apprendre à écrire lire dans des fichiers en bas niveau avec verrou (sous Linux)

    J'ai écrit une fonction qui me pose quelque problème, j'arrive à écrire dans un fichier, mais le record enregistrer ne correspond pas à ma structure. Je crois que le 3e argument de mon write est mauvais mais je n'en suis pas sûr:

    lseek(fd,0,SEEK_END);
    write(fd, proprio , sizeof(proprio));

    Ensuite, je me demande si l'ouverture du fichier "O_RDWR|O_CREAT" correspond bien à ce que je recherche à savoir lire le document pour vérifier si un record à le même id que celui que je veux ajouter et ensuite ajouter à la fin du fichier s'il n'existe pas, un nouveau record (Dois-je préférer "O_RDONLY|O_APPEND|O_CREAT" ? )

    Comme il s'agit de mes premiers verrouillages de fichier je ne suis pas sûr que tout soit correct, pouvez-vous me le confirmé ?
    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
     
    void addOwner()
    {
        proprietaire* proprio = (proprietaire*)malloc(sizeof(proprietaire));
    	if(proprio == NULL){
    		perror("L'allocation n'a pu etre réalisee\n");
    		exit(1);
    	}
     
        int fd=open(PATH_FILE_OWNER, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
        struct flock verrou;
        verrou.l_type=F_WRLCK;
        verrou.l_whence=verrou.l_start=verrou.l_len=0;
     
     
     
        while((fcntl(fd, F_SETLK, &verrou) )== -1 && (errno == EACCES || errno == EAGAIN)){
            sleep(5);
    		printf("Verrouiller\n");
        }
     
     
        int idDispo = FALSE,
            id;
        while(idDispo == FALSE)
        {
    	cleanBuffer();
        printf("Entrez un identifiant non utilise\n");
        scanf("%d", &id);
    	printf("id:  %d\n", id);
     
     
            // verifie si l'id est utilisé
            int trouve = FALSE, temp;
            while((temp = read(fd, proprio, sizeof(proprietaire))) != 0 && trouve == FALSE)
            {
    			// I have add this for verify the error, it is right ? (if yes I ll do every where :)
    			if(temp < 0){
    				printf("Boucle %d\n", temp); 
    				perror("erreur");
    				printf("errno=%d\n", errno);
    				exit(1);
    			}
     
                if(proprio->identifiant == id){
                    trouve = TRUE;
                }
            }
     
            // si l'id est utilisé redemande un autre id et refait une recherche,
            // sinon sort de la boucle et continue
            if(trouve == TRUE){
                printf("Identifiant deja utilise\n");
            } else {
                idDispo = TRUE;
            }
        }
     
        // demande le reste des info et initialise la structure
        proprio->identifiant = id;
        printf("Entrez son nom:\n");
        scanf("%s",proprio->nom);
        printf("Entrez son prenom:\n");
        scanf("%s",proprio->prenom);
        printf("Entrez son adresse:\n");
        scanf("%s",proprio->adresse);
        proprio->nbVoiture = 0;
     
    	   // test affichage
        printf("Id : %d\n", proprio->identifiant);
        printf("Nom: %s\n", proprio->nom);
        printf("Prenom: %s\n", proprio->prenom);
        printf("Adresse: %s\n", proprio->adresse);
        printf("Nombre de voiture posseder: %d\n\n", proprio->nbVoiture);
     
        // j'enregistrer le proprietaire
        lseek(fd,0,SEEK_END);
        write(fd, proprio , sizeof(proprio));
     
        // je deverrouille
        verrou.l_type = F_UNLCK;
        if (fcntl(fd, F_SETLK, &verrou) == -1){
            perror("Impossible de deverouiller le record");
            exit(1);
        }
        close(fd);
        free(proprio);
    }


    Merci d'avance

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(fd, proprio , sizeof(proprio));
    Ce 3° argument correspond à la taille d'un pointeur et non pas de la zone à écrire : sizeof(proprietaire)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Linquisiteur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void addOwner()
    {
        proprietaire* proprio = (proprietaire*)malloc(sizeof(proprietaire));
        ...
        if (fcntl(fd, F_SETLK, &verrou) == -1){
            perror("Impossible de deverouiller le record");
            exit(1);
        }
        close(fd);
        free(proprio);
    }
    Bonjour
    Pourquoi faire un malloc de 1 ? Peut pas déclarer directement une variable de type "proprietaire" ??? Accessoirement ça t'évitera de quitter ton programme via exit() (oui, tant qu'à faire, pourquoi quitter la fonction quand on peut quitter directement le programme) sans avoir libéré la zone allouée ni fermé le fichier...

    Citation Envoyé par Linquisiteur Voir le message
    lseek(fd,0,SEEK_END);
    write(fd, proprio , sizeof(proprio));

    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(fd, proprio , sizeof(proprio));
    Ce 3° argument correspond à la taille d'un pointeur et non pas de la zone à écrire : sizeof(proprietaire)
    Rajoute "t_" devant tes noms de type. Ca t'évitera de confondre "type" et "variables"...
    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]

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Bonjour et merci de m'aider,

    @Diogene: j'ai modifié, ça à résolu un de mes problèmes

    @Sve@r: je ne suis pas sûr de comprendre
    Tu veux que je fasse un "struct proprietaire proprio" et non un pointeur ?
    Sinon je de vais modifier mes noms de type de ce pas.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Linquisiteur Voir le message
    @Sve@r: je ne suis pas sûr de comprendre
    Tu veux que je fasse un "struct proprietaire proprio" et non un pointeur ?
    Quand tu dois stocker la valeur 123, est-ce que tu écris
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int *i;
    i=malloc(sizeof(int));
    *i=123;
    free(i);

    Ou bien plus simplement

    ???
    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]

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    et bien pour les structures j'ai toujours pris l'habitude de faire un malloc.. Pour être sur d'avoir allouer l'espace mémoire. (si je veux l'utiliser dans une fonction,.. )

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Quand j'écris dans mon fichier j'ai des choses bizarres qui s'y ajoutent si un mot d'une variable fait caractère et fini par y (azerty) et ensuite le prochain enregistrement de 4 lettres (dfgh) dans le fichier j'aurais dfgh#y ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    W azerty qwerty Arlon |& poitou roko y Bruxelle ¥² mmmm u nnnn y xxxx lle Ex ppppppp iiiiiii uuuuuuu Ñ/ GGGGG p FFFFF i DDDDD u
    On peut voir que les mots les plus longs ont leur fin de mot enregistrer sur d'autre record... (Bruxelle et plus loin lle par exemple)...

    D’ailleurs, je ne vois pas les identifiants et le 0 de nbVoiture

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Linquisiteur Voir le message
    et bien pour les structures j'ai toujours pris l'habitude de faire un malloc.. Pour être sur d'avoir allouer l'espace mémoire. (si je veux l'utiliser dans une fonction,.. )
    J'espère qu'en te relisant tu te rends compte de l'inconstance de tes arguments. Tu as pris l'habitude mais tu ne nous dis pas d'où elle vient ; tu dis que tu fais du malloc pour être sûr d'avoir l'espace mémoire nécessaire (oui à la rigueur on peut admettre que t'as plus d'espace dans le tas que dans la pile mais ça commence à influer à partir de plusieurs centaines de Mo) et si tu réfléchis, tu verras qu'en C, tu es toujours dans une fonction (à commencer par la fonction main())...


    Citation Envoyé par Linquisiteur Voir le message
    Quand j'écris dans mon fichier j'ai des choses bizarres qui s'y ajoutent si un mot d'une variable fait caractère et fini par y (azerty) et ensuite le prochain enregistrement de 4 lettres (dfgh) dans le fichier j'aurais dfgh#y ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    W azerty qwerty Arlon |& poitou roko y Bruxelle ¥² mmmm u nnnn y xxxx lle Ex ppppppp iiiiiii uuuuuuu Ñ/ GGGGG p FFFFF i DDDDD u
    On peut voir que les mots les plus longs ont leur fin de mot enregistrer sur d'autre record... (Bruxelle et plus loin lle par exemple)...

    D’ailleurs, je ne vois pas les identifiants et le 0 de nbVoiture
    Comment fais-tu pour regarder ce qui y est écrit ? As-tu conscience que ta façon d'écrire dans ton fichier fait que ce n'est pas un fichier texte que tu écris mais un fichier binaire. Il s'ensuit que si tu l'ouvres avec wordpad, ce que tu vois ne sera qu'une vision déformée de son contenu. D'ailleurs tu devrais rajouter le flag O_BINARY dans ton open(). Sous Linux ça ne changera rien mais ça rendra ton code compatible Windows...
    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]

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Merci pour O_BINARY, je compile sur linux mais rien n’empêche de rendre le programme portable.
    J'ai tenter de modifier pour ne pas allouer de structure mais j'ai créer des millions d'erreur...

    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
     
    void updateOwner()
    {
        t_proprietaire proprio;
     
        int fd=open(PATH_FILE_OWNER, O_RDWR|O_CREAT|O_BINARY, S_IRUSR|S_IWUSR);
        struct flock verrou;
        verrou.l_type=F_WRLCK;
        verrou.l_whence=verrou.l_start=verrou.l_len=0;
     
        printf("Id du proprietaire: \n");
        int id; scanf("%d",&id);
     
        while((fcntl(fd, F_SETLK, &verrou) )== -1 && (errno == EACCES || errno == EAGAIN)){
            sleep(5);
        }
     
        // je cherche la personne concerner et la modifie si elle existe
        int trouve = FALSE;
        while(trouve == FALSE && read(fd, proprio, sizeof(t_proprietaire)) != 0){
            if(proprio.identifiant == id){
                trouve = TRUE;
                printf(" L'adresse est %s\n Entrez la nouvelle adresse:\n", proprio.adresse);
                scanf("%s", proprio.adresse);
                lseek(fd, -sizeof(t_proprietaire) , SEEK_CUR);
                write(fd, proprio , sizeof(t_proprietaire));
            }
        }
     
        if(trouve == FALSE) printf("ID invalide\n");
     
        // je deverrouille le fichier
        verrou.l_type = F_UNLCK;
        if (fcntl(fd, F_SETLK, &verrou) == -1)
            perror("Impossible de deverouiller le record");
     
        close(fd);
    }
    Au passage j'ai peu être trouver mon erreur dans ma lecture du fichier, je vais tester et dire ce que j'en pense.

    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
     
    void showOwnerWithCar(){
     
        // on cherche le propriétaire
        printf("Entrez l'identifiant du proprietaire\n");
        int idChercher;
        scanf("%d", &idChercher);
     
     
        t_proprietaire* proprio = (t_proprietaire*)malloc(sizeof(t_proprietaire));
        if(proprio == NULL){
            perror("L'allocation n'a pu etre réalisee\n");
            exit(1);
        }
     
        int fdOwner = open(PATH_FILE_OWNER, O_RDONLY|O_CREAT|O_BINARY, S_IRUSR);
        int trouve = FALSE;
     
        while(read(trouve == FALSE && fdOwner, proprio, sizeof(t_proprietaire)) != 0)
        {
            printf("ici1\t");
            if(proprio->identifiant == idChercher)
            {
                trouve = TRUE;
            }
        }
        close(fdOwner);
        printf("ici2\t");
        t_voiture * car = (t_voiture*)malloc(sizeof(t_voiture));
        t_voiture * tabVoiture = malloc(proprio->nbVoiture * sizeof(t_voiture));
        int fdCar = open(PATH_FILE_CAR, O_RDONLY|O_CREAT|O_BINARY, S_IRUSR);
     
        // ensuite on cherche ces voitures
        int nbVoitureTrouver = 0;
        while(nbVoitureTrouver < proprio->nbVoiture && read(fdCar, car, sizeof(t_voiture)) != 0)
        {
            if(proprio->identifiant == idChercher)
            {
                tabVoiture[nbVoitureTrouver] = *car;
                nbVoitureTrouver++;
            }
        }
        close(fdCar);
        free(car);
     
     
        // on affiche le propriétaire
        printf("Id : %d\n", proprio->identifiant);
        printf("Nom: %s\n", proprio->nom);
        printf("Prenom: %s\n", proprio->prenom);
        printf("Adresse: %s\n", proprio->adresse);
        printf("Nombre de voiture posseder: %d\n\n", proprio->nbVoiture);
     
        // ensuite ces voitures
        int nbCar;
        for(nbCar=0;nbCar<proprio->nbVoiture;nbCar++){
            printf("Marque : %s\n", tabVoiture[nbCar].nomMarque);
            printf("Modele : %s\n", tabVoiture[nbCar].nomModele);
            printf("Couleur : %s\n",tabVoiture[nbCar].couleur);
            printf("Plaque : %s\n", tabVoiture[nbCar].plaque);
        }
     
        // on vide la mémoire
        free(proprio);
        for(nbCar=0;nbCar<proprio->nbVoiture;nbCar++){
            free(tabVoiture + nbCar);
        }
    }
    En voulant compiler sur l'erreur j'ai ausi l'erreur:
    O_BINARY underclared (first use in this function)


    Edit: j'ai remis mes ancienne structures et O_BINARY pour essayer mais il y a une chose que je ne comprend pas dans ma fonction: showOwnerWithCar() (ci dessus)

    Dans cette partie ci (j'ai rajouter des lignes pour essayer de comprendre le problème)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cleanBuffer();  // ajout
        printf("Entrez l'identifiant du proprietaire\n");
        int idChercher;
        scanf("%d", &idChercher);
    printf("Debut: %d", idChercher);  // ajout
    Et bien je dois rester appuyer 40 secondes sur enter pour passer le printf("debut..") de plus la valeur %d = 3 alors que j'y ai entrer 123. Je n'ai aucune idée de ce que cela peut être (j'ai fait plusieurs essai)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void cleanBuffer(){
        while( getchar() != '\n');
    }

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Linquisiteur Voir le message
    J'ai tenter de modifier pour ne pas allouer de structure mais j'ai créer des millions d'erreur...
    Généralement seule la première compte. Mais bien entendu, partout où c'était écrit "proprio->" il faut mettre "proprio." et partout où tu passais "proprio" à une fonction il faut écrire "&proprio"...

    Citation Envoyé par Linquisiteur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        int fdOwner = open(PATH_FILE_OWNER, O_RDONLY|O_CREAT|O_BINARY, S_IRUSR);
        int trouve = FALSE;
     
        while(read(trouve == FALSE && fdOwner, proprio, sizeof(t_proprietaire)) != 0)
    Punaise je pige que dalle à cet appel. Au lieu de passer à read() un identifiant de fichier tu lui passes un booléen. T'es sûr de ton coup ???

    Citation Envoyé par Linquisiteur Voir le message
    En voulant compiler sur l'erreur j'ai ausi l'erreur:
    O_BINARY underclared (first use in this function)
    Oui, c'est un flag qui n'existe pas sous linux. ici il y a quelques conseils pour pallier à ce soucis...

    Citation Envoyé par Linquisiteur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void cleanBuffer(){
        while( getchar() != '\n');
    }
    Pas mal vu Faut juste aussi penser à tester EOF dans le cas où il n'y aurait pas de'\n'...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void cleanBuffer(){
        int c;
        while ((c=getchar()) != '\n' && c != EOF);
    }
    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]

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    ah merci le code commence à fonctionner.
    Ma boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(trouve == FALSE && read(fdOwner, &proprio, sizeof(t_proprietaire)) != 0)
    ne détecte pas la fin du fichier. J'aurais cru que si la valeur était 0 il s'agissait de la fin mais si je recherche un utilisateur qui n'existe pas je tourne à l'infinie.

    Sinon j'ai réussi à modifier les structures


    P.S mon erreur dans la boucle, je croyais l'avoir corriger mais comme j'ai 3 codes sources (les sauvegardes) j'ai modifier le mauvais..

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Linquisiteur Voir le message
    while(trouve == FALSE && read(fdOwner, &proprio, sizeof(t_proprietaire)) != 0)
    ne détecte pas la fin du fichier. J'aurais cru que si la valeur était 0 il s'agissait de la fin
    Exact. read() te renvoie le nombre d'octets lus donc si read() te renvoie 0 c'est que t'as tout lu et atteint la fin de fichier (et s'il te renvoie -1 c'est qu'il y a un problème à la lecture)

    Citation Envoyé par Linquisiteur Voir le message
    mais si je recherche un utilisateur qui n'existe pas je tourne à l'infinie.
    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
    while (read(...) > 0)
    {
        if (id_proprio == id_cherché)
              break;
    }
     
    if (id_proprio == id_cherché) 
    {
        // Actions à faire si id trouvé
    }
    else
    {
        // Actions à faire si id pas trouvé
    }
    ...
    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. Créer et écrire dans un fichier.txt
    Par Furius dans le forum VBScript
    Réponses: 11
    Dernier message: 16/05/2016, 12h27
  2. Ouvrir et écrire dans un fichier .txt en T-SQL
    Par joul's dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 27/10/2008, 21h04
  3. [FTP] Lire et écrire dans un fichier
    Par dj-julio dans le forum Langage
    Réponses: 49
    Dernier message: 12/01/2006, 11h59
  4. [Rech. Comp.] Lire et écrire dans des fichiers XML
    Par Rodrigue dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/08/2005, 20h48
  5. [JAR] Comment écrire dans un fichier properties dans un jar
    Par Alec6 dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 05/10/2004, 15h16

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