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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 confirmé
    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
    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)

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    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 confirmé
    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
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    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 confirmé
    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
    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 confirmé
    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
    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

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