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

Langage Perl Discussion :

Lecture et écriture en écrasement, pourquoi un fichier vide ?


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 33
    Points : 27
    Points
    27
    Par défaut Lecture et écriture en écrasement, pourquoi un fichier vide ?
    Bonjour,
    J'ai un problème avec un fichier dans lequel j'écris tout d'abord, puis que je souhaite relire pour réécrire dedans. En effet, si l'écriture de base ne pose aucun problème, je n'arrive pas, et ce même si j'essaye depuis un autre programme, à lire puis à écrire ce fichier en écrasement.
    Voici le fichier que je voudrais lire puis sur lequel je voulais réécrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    use strict 
    use warnings 
    lvkdnvlf: 
    print "blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla blabla\n"
    print "blabla blabla blabla blabla blabla blabla blabla blabla"
     
    iubndkjb
    print "blabla" 
    btrbr fb
    rbrbrbfb
    yigikbj
    a
    a
    Alors, bien entendu, ce "code" est étrange (et surtout non fonctionnel me diriez-vous), mais c'est le résultat d'un projet que j'essaye de réaliser, qui consiste à lire un fichier, voir si un print a pour argument une chaîne de plus de 80 caractères (qui est la taille d'un invite de commande sous Windows), et à le séparer et 2 print différents (bien que l'on aurait tout aussi bien pu mettre \n au milieu, mais c'est plus lisible ainsi je trouve).
    Et voici comment j'ai essayé de m'y prendre (le but étant de rajouter des ; à la fin de chaque ligne) :
    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
    use strict;
    use warnings;
     
    my $filename = "Test_Recopiage.pl";
     
    open (my $fh, '+>', $filename)
        or die "Impossible d'ouvrir le fichier '$filename' en lecture";
     
    my $compteur = 1;
     
    while (my $ligne = <$fh>)
    {
        print $fh "$ligne;";
        ++$compteur;
    }
    close $fh;
    Le problème, c'est que si je l'ouvre en ajout, et bien, il ajoute, et que si je l'ouvre en écrasement, il ne m'affiche rien et considère que le fichier est vide. En revanche, ce qu'il ajoute en mode ajout est bien ce que je veux qu'il écrive.
    Je sais bien que ce code n'est pas bon car les caractères \n vont m'ennuyer, mais j'aimerais au moins comprendre pourquoi je ne peux pas lire et écrire dans un fichier, ou bien comment faudrait-il faire pour y arriver.
    Merci d'avance !

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Tu ne peux pas lire et écrire dans le même fichier en Perl 5

    Tu peux lire et écrire dans un fichier temporaire et ensuite tu renommes ton fichier avec l'ancien nom (écrasement).
    OU
    Tu lis et mets les lignes dans une variable, tu ferme la lecture, tu rouvres le fichier en écriture et du écris la variable deedans

    Fais attention tu dis vouloir mettre des "\n" (UNIX) et tu parles d'invite de commande Windows au début: la fin de ligne Windows est "\r\n"

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 33
    Points : 27
    Points
    27
    Par défaut
    Bonjour,
    Tout d'abord, merci de m'avoir répondu, et de m'avoir apporté une solution
    Juste ce que je ne comprends pas, c'est lorsque tu dis que la fin de ligne Windows est "\r\n"... Je veux dire, tous les scripts que j'ai fait avec "\n" fonctionnaient normalement sous Windows pourtant ^^

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Pour ce qui est des "\n" dans ton script et dans ta sortie oui ça ne devrait pas poser de problème.

    Je tenais juste à te sensibiliser sur le fait que les fins de ligne dans un fichier Windows sont généralement "\r\n" et donc si tu lis modifies un fichier Windows attention à ne pas utiliser 2 fin de lignes différentes afin d'éviter les problèmes

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par BunshinKage Voir le message
    Juste ce que je ne comprends pas, c'est lorsque tu dis que la fin de ligne Windows est "\r\n"... Je veux dire, tous les scripts que j'ai fait avec "\n" fonctionnaient normalement sous Windows pourtant ^^
    Oui, la fin de ligne Windows est "\r\n" alors que c'est "\n" sous Unix ou Linux. Mais ça marche quand même pour toi parce quand Perl détecte qu'il tourne sous Windows, il ajoute de lui-même le "\r" avant le "\n". Cela ne pose occasionnellement des problèmes que quand tu transfères un fichier d'un type de plateforme à l'autre (FTP en mode ASCII fait la conversion dans les deux sens, mais d'autres logiciels ne le font pas (SFTP, par exemple) et il faut dans ce cas ajouter une étape de conversion.

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

Discussions similaires

  1. lecture et écriture des tags d'un fichier audio
    Par Rachel dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 08/01/2012, 06h30
  2. lecture et écriture de données dans un fichier
    Par follichon dans le forum C
    Réponses: 1
    Dernier message: 24/11/2011, 12h17
  3. Réponses: 4
    Dernier message: 10/08/2006, 01h49
  4. [VB.NET]Problème de lecture et écriture sur fichier texte
    Par zouhib dans le forum Windows Forms
    Réponses: 25
    Dernier message: 23/05/2006, 15h30
  5. Ouvrir un fichier texte en lecture ET écriture
    Par Steph12 dans le forum C++
    Réponses: 12
    Dernier message: 17/06/2005, 08h08

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