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 :

fopen : comment réouvrir un fichier sans écraser le contenu


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 14
    Points
    14
    Par défaut fopen : comment réouvrir un fichier sans écraser le contenu
    Bonjour,

    J'ai déjà été voir tous les modes possibles pour fopen, et je n'en trouve aucun qui corresponde à mon besoin...j'e m'explique :
    je créé un fichier avec fopen, et je fais un fwrite à un endroit précis dans le fichier (pas au début justement!).
    Par la suite, je souhaite pouvoir réouvrir ce fichier et le compléter avec un fwrite, et cela sans perdre ce qu'il y avait dedans puiqu'il s'agit de le compléter.
    Bon ça je sais faire, mais là où ça pose problème, c'est que j'ai besoin d'écrire des données avant celles que j'ai déjà écrit, or avec append, le descripteur considère que le début du fichier est à la fin de ce qu'il y avait précédemment dedans!
    Du coup, pas moyen d'accéder aux données précédentes (même avec un fseek)...et donc pas moyen de faire un fwrite dans la zone écrite avant réouverture du fichier!

    Quelqu'un aurait-il une idée?
    Même si ce n'est pas les mêmes fonctions que moi qu'il faut utiliser, je suis preneur!
    Le tout c'est qu'il faut que je puisse écrire entre des données déjà écrites après une réouverture...

    Merci d'avance

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Pas la peine de réouvrir.

    La méthode la plus simple, c'est de recréer un fichier et de recopier le début du fichier que tu veux modifier dedans, écrire ta modification, et compléter ce nouveau fichier avec la fin.

    Ecrire des données au milieu d'autres est très très hasardeux, c'est pourquoi il vaut mieux utiliser un buffer avec lequel tu pourras écraser ton fichier à modifier.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Si ton, problème est d'insérer des données à un endroit précis du fichier, la seule solution est de créer un nouveau fichier, de recopier les anciennes données jusqu'à l'endroit où insérer, copier les nouvelles données puis recopier les anciennes jusqu'à la fin du fichier de départ, ensuite tu les fermes tous les deux, tu efffaces l'ancien et tu renommes le nouveau avec le nom de l'ancien.
    J'espère avoir été clair.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Re: fopen : comment réouvrir un fichier sans écraser le cont
    Bonjour,
    Citation Envoyé par bios
    or avec append, le descripteur considère que le début du fichier est à la fin de ce qu'il y avait précédemment dedans!
    Du coup, pas moyen d'accéder aux données précédentes (même avec un fseek)...et donc pas moyen de faire un fwrite dans la zone écrite avant réouverture du fichier!
    Plutot bizare comme comportement Normalement, l'ouverture en ajout (option a) ouvre le fichier s'il existe et place le curseur en fin de fichier, par conséquent avec un fseek tu peux remonte au début du fichier. Par contre la modification du contenu d'un fichier n'est pas quelque chose de trivial, exemple avec la suppression d'une ligne : Comment supprimer une ligne dans un fichier

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    C'est vrai que je n'ai pas pensé à recopier le fichier en y insérant la modification...pas con du tout!

    Merci beaucoup pour vos lumières (ça sera plus pénible à mettre en place que ce que j'espérais, mais bon, au moins ça marchera! )

    Pour gege2061, j'avoue ne pas être sûr que ça ne marche pas vu qe je n'ai pas tenté de mettre des valeurs négatives dans fseek : j'ai juste tenté avec le flag à 0, ce qui met le descripteur à la fin du fichier avant que je le rouvre...donc je n'accède pas à ce qu'il y avait avant.
    Ca coûte rien d'essayer avec des négatifs mais je préssens une grosse erreur de compil!

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(stream, 0, SEEK_SET);
    Te déplace au début du fichier
    Citation Envoyé par bios
    Pour gege2061, j'avoue ne pas être sûr que ça ne marche pas vu qe je n'ai pas tenté de mettre des valeurs négatives dans fseek : j'ai juste tenté avec le flag à 0, ce qui met le descripteur à la fin du fichier avant que je le rouvre...donc je n'accède pas à ce qu'il y avait avant.
    Ca coûte rien d'essayer avec des négatifs mais je préssens une grosse erreur de compil!
    Je ne pense pas qu'il y ai une erreur de compilation mais plutot un comportement indéfini lors de l'exécution. Pour éviter tout problème, il suffit de tester le retour de fseek qui est non null en cas d'erreur (donc si la fonction ne supporte pas les index négatif, elle va gentillement te le dire).

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 13
    Points : 14
    Points
    14
    Par défaut
    Exact, je viens de tester le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    c = fseek(res, -1, SEEK_SET);
    	if (c != 0) {
    		perror("fseek ");
    		exit(1);
    	}
    Et il me met :
    fseek : Invalid argument.
    Donc fseek ne doit pas aimer les valeurs négatives (du moins en partant de SEEK_SET), ce qui serait le seul moyen pour moi d'accéder aux données écrites avant la réouverture...
    Dommage, je vais devoir faire de la copie de fichier avec insertion

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 07/02/2013, 10h22
  2. Réponses: 1
    Dernier message: 01/06/2009, 05h12
  3. [JDOM] comment écrire dans un fichier xml sans écraser son contenu
    Par solawe dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 25/03/2008, 14h11
  4. [Info]Comment compiler un fichier sans le lancer ?
    Par blan dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 10/10/2005, 17h03
  5. [Abrevia] Comment zipper un fichier sans inclure son répertoire ?
    Par DelphiSteph dans le forum Composants VCL
    Réponses: 2
    Dernier message: 04/02/2005, 20h01

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