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

Fortran Discussion :

[Fortran 77] Réécrire une ligne de fichier existant sans détruire le reste


Sujet :

Fortran

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [Fortran 77] Réécrire une ligne de fichier existant sans détruire le reste
    Bonjour, voici ma question que je n'ai pas réussi à résoudre avec la documentation:

    J'ai un fichier texte banal de 200 lignes qui contient des déclarations de variables, je voudrais juste réécrire une ligne (disons la troisième) sans toucher au reste du fichier.

    En faisant ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    open(unit=1, file='machin', status='old')
    read(1,*)
    read(1,*)
    write(1,*) 'ma 3ieme ligne réécrite', var
    close(1)
    je conserve mes deux premières lignes, je modifie la troisième et toute la suite du fichier est effacé!
    Du coup pour conserver mes 200 lignes suivantes je fais comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    open(unit=1, file='machin', status='old')
    read(1,*)
    read(1,*)
    write(1,*) 'ma 3ieme ligne réécrite', var
     
    do 100 k=1,300
    read(1,*)
    100 continue
     
    close(1)
    et ça marche, le fichier est correctement modifié mais par contre c'est trés moche.
    Il doit exister une façon propre de faire, en jouant avec l'option access de l'instruction open par exemple?

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par jojo_fortran
    J'ai un fichier texte banal de 200 lignes qui contient des déclarations de variables, je voudrais juste réécrire une ligne (disons la troisième) sans toucher au reste du fichier.
    Un script shell est largement suffisant pour ce genre de choses, mais si tu tiens a le faire en Fortran, il faut utiliser un fichier temporaire:
    - ouvrir le fichier original
    - creer un fichier temporaire
    - parcourir le fichier original ligne par ligne, ne recopier que les lignes qu'il faut (en ajoutant d'autres lignes, eventuellement)
    - fermer le fichier original et le fichier temporaire
    - eventuellement, ecraser le fichier original par le fichier temporaire.

    Modifier directement le fichier original est dangeureux et, en regle generale, on perd les donnees.

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci mais je me demandais s'il n'était pas possible d'agir directement sur une ligne particulière sans toucher aux autres (comme avec awk ou sed en shell).
    Sinon ma facon devient plus propre en remplacant la boucle sur les k par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
          ios = 0
          nb_val= 0
          do while (.true.)
               read(unit=3,fmt=*,iostat=ios)
                if (ios .ne. 0) exit
          enddo

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    sed et awk utilisent la technique que je presente ci-dessus (la fonction de filtrage des lignes est plus compliquee). Comme fichier temporaire, ils utilisent simplement la sortie standard (l'unite 6 en Fortran). Libre a l'utilisateur de rediriger la sortie standard vers un autre fichier. Essayer d'enlever ou ajouter une ligne a un fichier sans passer par un fichier temporaire est tres acrobatique et se termine souvent par la corruption du fichier original - ce qui est rarement le resultat souhaite.

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Tout à fait d'accord, je viens de tester ce genre de corruption de fichier original en dirigeant la sortie standard vers le fichier d'origine..
    J'ai finalement fait la manip en Shell, je mets le code en esperant que ça aide quelqu'un car c'est pas facile de prendre les commandes sed et awk en main. Mais je précise que ça reste du bricolage de débutant, les vrais codeurs sauront me corriger!

    Donc disons que je veux lire une variable 'jojo' dans un fichier 'fic1' et que je veux attribuer sa valeur incrementé de 1 à une variable 'toto' déclarée dans mon fichier 'fic2':

    fic1 contient ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    jojo= 453 #variable que je veux transferer
    fic2 contient ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toto= 123 #variable que je veux réécrire
    Je fait la lecture de ma variable avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vartemp=`grep 'jojo=' fic1 | cut -d='' -f2
    Je l'écrit dans l'autre fichier sans toucher au reste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sed -r "s/toto= [0-9]+/toto= `expr $vartemp + 1`/g" fic2 > temp.txt
    cp temp.txt fic2 #attention la on réécrit sur le fichier d'origine
    A l'arrivé fic2 contiendra:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    toto= 454 #variable que je veux réécrire

Discussions similaires

  1. Comment écrire une ligne de code très longue sur plusieurs lignes
    Par Vincent32 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/11/2018, 09h28
  2. [Batch] Comment écrire une ligne de commande dans un autre batch ?
    Par pierrot91000 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 02/04/2011, 12h31
  3. [vb.net] ajouter une ligne à un fichier txt existant
    Par tbdarkspirit dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/05/2007, 11h41
  4. Extraire Une Ligne Du Fichier
    Par chakcc dans le forum C
    Réponses: 2
    Dernier message: 16/10/2006, 11h45
  5. [Fichier] ecrire a une ligne de fichier
    Par woorant dans le forum Langage
    Réponses: 4
    Dernier message: 17/01/2006, 18h52

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