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 :

se positionner dans un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut se positionner dans un fichier
    Bonjour,

    j'aimerais savoir s'il était possible de se positionner dans un fichier.
    Je souhaiterais remplacer une ligne d'une fichier en C sans changer le reste.
    comment je pourrais faire.

    Je ne peux pas copié tout le fichier dans une variable car celui est trop gros.

    Cordialement

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 117
    Par défaut
    attention modifier le contenu d'un fichier ne fait pas d'insertion à proprement parler, mais il ecrase directement le contenu à l'endroit specifié.

    si le fichier est trop gros pour etre charger en memoire integralement, utilise un buffer pour le faire petit à petit.

    tu recopies en bufferisant dans un nouveau fichier jusqu'à l'endroit ou tu veux inserer, puis tu inseres dans ce fichier les nouvelles données, puis tu recopies la suite. Enfin tu supprimes l'ancien fichier et tu renommes le nouveau avec le nom qu'il faut.

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    le problème c'est que je doit remplacer plusieurs lignes et lors ce que j'en remplace une je ne c'est pas encore les quelles je doit remplacer.
    en faite chaque ligne commence par un "id", et je li tout les id dans un autre fichier. Si un "id" et dans le fichier je le remplace. le problème c'est que mes "id" ne sont pas trié, donc passez par un buffer c'est un peut compliquer.
    Il n'y a pas de moyen de remplacer une ligne? Ou au pire de supprimer?

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    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 478
    Par défaut
    Il existe beaucoup d'outils pour faire ce que tu veux faire. J'imagine que tu travailles sous Windows, mais sous Unix, par exemple, il y a une miriade de commandes pour faire ce genre de chose. C'est possible en C également, mais ce n'est pas à proprement adapté à ce genre de manipulation en particulier.

    À toi de nous dire, donc, si l'objectif est réellement d'écrire en programme en langage C, ou si ce n'est qu'un but à atteindre. On t'orientera différemment.

    Toutefois, il n'y a pas de miracle lorsque l'on traite des fichiers texte, mais ce n'est pas forcément difficile non plus. Si tu veux insérer ou supprimer une ligne quelque part, alors il faut décaler le contenu du fichier pour faire de la place. Le plus simple, aujourd'hui, pour faire cela est d'utiliser le file mapping et de décaler le tout comme s'il s'agissait de mémoire vive ordinaire.

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    non je dois faire une version pour linux en c.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par totofe Voir le message
    le problème c'est que je doit remplacer plusieurs lignes et lors ce que j'en remplace une je ne c'est pas encore les quelles je doit remplacer.
    en faite chaque ligne commence par un "id", et je li tout les id dans un autre fichier. Si un "id" et dans le fichier je le remplace. le problème c'est que mes "id" ne sont pas trié, donc passez par un buffer c'est un peut compliquer.
    Il n'y a pas de moyen de remplacer une ligne? Ou au pire de supprimer?
    Non. Tu dois copier le fichier ligne à ligne dans un autre fichier en omettant celles qui doivent être supprimées ou en modifiant celles qui doivent être modifiées.

    Les système de fichier C est rustique. Pour faire des choses plus sophistiquées, on utilise une base de données, par exemple compatible avec SQL, car c'est un langage de BdD très courant et très connu.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bien qu'il soit possible de modifier une portion d'un fichier sans changer le reste, il est impossible de changer la taille de ladite portion.
    Ce qui exclut toute manipulation de fichier texte. Si tu veux modifier un fichier texte, tu es obligé de passer par une copie.

    Si tu manipules un fichier binaire avec des enregistrements de taille fixe, alors seulement là on peut parler de modifier le fichier sans faire de copie avant. Et encore, ça reste imprudent.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    411
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 411
    Par défaut
    c'est bon mon programme fonctionne enfin, après plusieur heure de recherche et d'essai ^^.
    il suffisait d'ouvrir le fichier avec un l'argument "r+".

    ex:
    resultat.txt contient "abc"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    result = fopen("resultat.txt","r+" );
    offset = fseek( result, 1L, SEEK_SET);
    fprint(result,"f" );
    resultat.txt devient "afc"

    et cela permet aussi d'en ajouter si on se place en fin de fichier ^^


    Vous voyez que c'est possible et c'est pas du tout compliqué

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    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 478
    Par défaut
    Citation Envoyé par totofe Voir le message
    resultat.txt contient "abc"
    et cela permet aussi d'en ajouter si on se place en fin de fichier ^^


    Vous voyez que c'est possible et c'est pas du tout compliqué
    Non. Là, tu as remplacé un caractère par un autre. Les deux ont le même format. Comment comptes-tu t'y prendre si ta ligne à remplacer n'a pas la même longueur que la nouvelle ligne ?

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

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Non. Là, tu as remplacé un caractère par un autre. Les deux ont le même format. Comment comptes-tu t'y prendre si ta ligne à remplacer n'a pas la même longueur que la nouvelle ligne ?
    Il l'a dit dans son post, on peut en ajouter si on est en fin de fichier ce qui est logique.

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    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 478
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Il l'a dit dans son post, on peut en ajouter si on est en fin de fichier ce qui est logique.
    Il a dit aussi : « Je souhaiterais remplacer une ligne d'un fichier en C sans changer le reste ».

  13. #13
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Bonsoir,

    Citation Envoyé par totofe Voir le message
    c'est bon mon programme fonctionne enfin, après plusieur heure de recherche et d'essai ^^.
    il suffisait d'ouvrir le fichier avec un l'argument "r+".

    ex:
    resultat.txt contient "abc"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    result = fopen("resultat.txt","r+" );
    offset = fseek( result, 1L, SEEK_SET);
    fprint(result,"f" );
    resultat.txt devient "afc"

    et cela permet aussi d'en ajouter si on se place en fin de fichier ^^


    Vous voyez que c'est possible et c'est pas du tout compliqué
    Ce n'est pas portable (ni standard), par exemple sous Windows '\n' fait souvent 2 octets.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/04/2014, 17h26
  2. Réponses: 1
    Dernier message: 25/03/2011, 18h48
  3. extraire une ligne positionnée dans X fichiers
    Par AlexFred dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2008, 17h42
  4. Positionner le curseur dans un fichier
    Par be_tnt dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 15/05/2006, 14h30
  5. Réponses: 2
    Dernier message: 11/03/2004, 15h20

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