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 :

fichier d'enregistrement C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de fahdijbeli
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 281
    Par défaut fichier d'enregistrement C
    bonjour,
    je sais pas comment peut on écrire ou lire dans un fichier des enregistrement , je dit par enregistrement c'est une structure (struct) par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct monotonie
    {
        int * valeurs;
    } typedef monotonie monotonie;
    a chaque fois je remplie une structure je l'écrire dans le fichier , ah cela comment le fait , par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    monotonie mon;
    //supposant on a lit la monotonie 
    fprintf(file,"ici je met quoi comme format ",mon);
    regarder mon c'est une structure . et j'ai trouvé une solution pour mettre dans le fichier ce qui est dans la structure mon que je l'aime pas . je veux directement ajouter cette stucture dans mon fichier .
    et Merci .

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Aaaah !
    Mon cher forumeur... si tu faisais du COBOL ou du travail sur Mainframe... la vie te serait facilitée !
    Cependant, tu travailles sur un langage designé pour "l'autre" type de système : UNIX !
    Dans ce fabuleux langage qu'est le C, il n'y a pas "d'enregistrements" faciles à écrire et lire pour un développeur, puisque chaque donnée est considérée comme séparée par un '\n' (ou un équivalent que le C++ te donne) : donc de taille variable.

    Bref, hormis de l'historique et du blabla technique je vais à l'essentiel :
    Tu dois décrire ton propre format d'écriture et de lecture !
    CAD : tu dois écrire chaque champ de ta structure avec un 1er séparateur de ton choix, et séparer chaque structure par un 2e séparateur.
    Et quand tu liras, tu liras pour chaque 2e séparateur une ligne, et dedans, pour chaque 1er séparateur tu rempliras un champ de la structure.
    Tu comprendras facilement que le "2e séparateur" pourra être un '\n' pour faciliter le travail et utiliser getline ou son équivalent fgetline/fgetln.

    EDIT : dans ton cas,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(file, "%d\n", mon->valeur);
    Ecrira sur chaque ligne un entier
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre éclairé Avatar de fahdijbeli
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juin 2012
    Messages : 281
    Par défaut
    Merci beaucoup Metalman , c 'est exactement ce que j'ai pensé , mais j'ai cru qu'il y a une possibilité de créer une structure dans un fichier directement sans faire les séparateur comme dans le langage pascal . donc ce que j'ai compris de ton explication il n'y a pas de possibilité .

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par Metalman Voir le message
    Aaaah !
    Mon cher forumeur... si tu faisais du COBOL ou du travail sur Mainframe... la vie te serait facilitée ! Cependant, tu travailles sur un langage designé pour "l'autre" type de système : UNIX !
    Ce n'est pas comparable : le C est principalement destiné à la production d'exécutables en langage machine. Essaie d'écrire un pilote de périphérique ou de programmer un micro-contrôleur en Cobol, par exemple.

    Dans ce fabuleux langage qu'est le C, il n'y a pas "d'enregistrements" faciles à écrire et lire pour un développeur, puisque chaque donnée est considérée comme séparée par un '\n' (ou un équivalent que le C++ te donne) : donc de taille variable.
    Initialement, si : c'est même pour cela que les fonctions fread() et fwrite() attendent à la fois une taille et un nombre d'enregistrements. Si tu veux faire des enregistrements avec des champs de taille fixe, il suffit de définir une structure, et d'y intégrer des tableaux de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct champ
    {
        char prenom [16];
        char nom    [16];
        char ville  [16];
    };
    Il te suffit ensuite de faire des lectures-écritures en mémoire de la taille d'une telle structure. Les seules subtilités auxquelles il faudra faire attention si tu veux faire un programme portable seront :

    • Le padding éventuel entre les membres. Il existe bien « #pragma pack » mais c'est par définition hors-norme ;
    • L'endianess si tu utilises des types numériques ;
    • La taille des caractères. Si tu travailles en ASCII, toutefois, il te faudra vraiment utiliser des architectures très exotiques pour te retrouver avec des caractères d'une largeur différente de 8 bits.


    Presque tous les langages de cette époque savaient gérer les fichiers de cette manière, y compris le Basic Microsoft sur Thomson (entre autres), qui proposait OPEN, FIELD, GET, PUT, LSET et RSET.

    Bref, hormis de l'historique et du blabla technique je vais à l'essentiel :
    Tu dois décrire ton propre format d'écriture et de lecture !
    CAD : tu dois écrire chaque champ de ta structure avec un 1er séparateur de ton choix, et séparer chaque structure par un 2e séparateur.
    Et quand tu liras, tu liras pour chaque 2e séparateur une ligne, et dedans, pour chaque 1er séparateur tu rempliras un champ de la structure.
    Non.

    Ça n'est vrai qu'à partir du moment où tu travailles avec des fichiers texte, ce qui est effectivement recommandé, tant pour la portabilité et la pérennité dans le temps que pour la facilité d'édition desdits fichiers par l'utilisateur et/ou l'administrateur système.

  5. #5
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Et comme la taille des types varie en fonction de l'architecture... que certaines archis sont big/little endian....
    Que les UNIX ont été mis sur de multiples archis (la liste est longue et TRES doiversifiée)... alors je réponds "non" à beaucoup de choses précédentes dont principalement le "fwrite"/"fread"...

    Parce que écrire un int sur un 8086, puis le lire avec un Alpha avec le même programme C recompilé de l'autre côté.... ça ne le fera sûrement pas...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Citation Envoyé par Metalman Voir le message
    Et comme la taille des types varie en fonction de l'architecture... que certaines archis sont big/little endian....
    Que les UNIX ont été mis sur de multiples archis (la liste est longue et TRES doiversifiée)... alors je réponds "non" à beaucoup de choses précédentes dont principalement le "fwrite"/"fread"...

    Parce que écrire un int sur un 8086, puis le lire avec un Alpha avec le même programme C recompilé de l'autre côté.... ça ne le fera sûrement pas...
    (u)intXX_t et htoln

  7. #7
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Ca sent le #define avec un tas de fonctions...

    C'est une bonne idée du coup pour rendre l'ensemble "réellement" portable à l'exécution et pas seulement à la compilation...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer un fichier d'enregistrements
    Par Oregor dans le forum Langage
    Réponses: 19
    Dernier message: 02/06/2012, 20h02
  2. exporter un fichier avec enregistrer uniquement
    Par dietrich dans le forum Framework .NET
    Réponses: 6
    Dernier message: 01/03/2007, 10h12
  3. [TP] Création de fichiers d'enregistrements
    Par amine6441 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 27/02/2007, 22h51
  4. Réponses: 18
    Dernier message: 22/06/2006, 10h28
  5. [VBA-Excel,VB6,Fichier texte]enregistrer un classeur excel..
    Par Tarul dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/01/2005, 13h09

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