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 :

Convertir un retour chariot Unix en retour chariot Windows


Sujet :

C++

  1. #1
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut Convertir un retour chariot Unix en retour chariot Windows
    Bonjour,

    Je travaille actuellement sous Redhat 9, avec le compilateur g++. J'ai créé une ptite classe StringList, qui contient une liste de string à la manière du TStringList de C++ Builder. J'ai développé des méthodes LoadFromFile, et SaveToFile...

    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
    void StringList::SaveToFile(string nom_fichier)
    {
    FILE *fe;
    int i;
    fe = fopen(nom_fichier.c_str(), "w");
    if(fe!=NULL)
    {
       i=0;
       while(i<this->Count)
       {
             fprintf(fe, "%s\n", this->Strings[i].c_str());
             i++;
       }
    }
    fclose(fe);
    }
    Mon souci est que les fichiers textes créés avec SaveToFile ont des retours chariots différents de ceux couramment utilisés par les applications sous Windows. Y'a-t'il une méthode pour définir le type de retour chariots (CM ou CR je crois...) ? J'ai essayé \s mais ça ne semble pas fonctionner correctement...

    Merci pour vos suggestions !

  2. #2
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    suggestion n°1 : pas de FILE*, fopen() and co dans du C++.

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour
    Retour chariot unix : '\n'
    Retour chariot win : '\r\n'

  4. #4
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    J'ai changé mon code ainsi :

    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
    void StringList::SaveToFile(string nom_fichier)
    {
    std::ofstream fe (nom_fichier.c_str());
    int i;
    if(fe!=NULL)
    {
       i=0;
       while(i<this->Count)
       {
          fe << this->Strings[i].c_str() << "\r\n";
          i++;
       }
    }
    fe.close();
    }
    mais les fichiers textes que j'obtiens sont toujours moitié bugués sous Windows : les retours chariots sont là, mais un peu bizarres, du genre un coup 3 retours, un coup 4, un coup 5... etc. (Peut-être est-ce du à l'utilisation de cygwin ?)

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Salut

    Pour l'ecriture dans un fichier, à supposer que tu utilises un conteneur standard pour stocker tes chaînes, en C++ on procède plutôt comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void StringList::SaveToFile(const string& nom_fichier) // <-- référence constante !
    {
        ofstream File("nom_fichier.c_str()");
        copy(Strings.begin(), String.end(),  ostream_iterator<string>(File, "\n"));
    }
    N'est-ce pas plus mignon ?

  6. #6
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Merci Loulou, c'est vrai que ça optimiserait encore mon code mais je n'utilise pas de conteneurs standards, j'utilise simplement un string *Strings...

    Par contre, pour mon problème de retours chariots, ça me fait toujours des trucs bizarres

  7. #7
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     fe << this->Strings[i].c_str() << "\r\n";
    essaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     fe << this->Strings[i] << std::endl;

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu as un simple tableau dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    copy(Strings, String + Count,  ostream_iterator<string>(File, "\n"));
    Mais je te conseille d'utiliser des conteneurs standards, style std::list<std::string>. Cela te machera la plupart du boulot de ta classe StringList.

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour tes retours chariots, à part le bloc note qui n'est pas très futé, n'importe quel éditeur un peu plus évolué comprend très bien les retours chariots Unix. Ca te pose quel genre de problème ?

  10. #10
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    En fait, les fichiers que je convertis avec mon application sont utilisés en entrée d'une autre application, sous Windows. Cette application sous Windows est un modèle de simulation, et a été développée il y a fort longtemps... et il ne parvient pas à lire mes fichiers textes créés sous Unix ! Il fonctionne un peu de la même manière que le simple notepad de Windows, donc ça me pose de gros problèmes, car je ne peux absolument pas changer le modèle de simulation.

    J'ai donc tenté :

    - \n : reconnu comme des caractères spéciaux

    - \r\n : reconnu comme des retours chariots, avec des caractères spéciaux au milieu. D'ailleurs si j'ouvre mon fichier sous vi j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ligne1:^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M
    ligne2:^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M
    ligne3:^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M
    ligne4:^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M
    ligne5:^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M
    ligne6:^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M
    ligne7:^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M
    ligne8:^M^M^M^M^M^M^M^M^M^M^M^M^M^M
    ligne9:^M^M^M^M^M^M^M^M^M^M^M^M^M
    etc
    c'est louche quand meme !

    - std::endl; : ça n'est pas reconnu comme des retours chariots


    Peut-être est-il nécessaire que je passe par une application extérieure sous Unix, pour convertir ces foutus retours chariots ?!!

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Je pense que c'est dû à l'utilisation de cygwin qui considère que le retour chariot par défaut est "\n".
    Si tu veux le "\r", je crois bien que tu va devoir ouvrir ton fichier en mode dit "binaire" (qui n'a rien à voir avec la distinction fichier texte/fichier structuré) et stocker à la main tes "\r\n"
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  12. #12
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    Merci à tous pour vos conseils.

    Après réflexion... je me suis rendu compte que les ^M^M qui apparaissaient comme cela, bizarrement en pyramide... étaient dus aux ouvertures répétées du fichier par mon application, pour y ajouter des lignes !

    Donc le \r\n fonctionne très bien, mais il faut faire attention lors de la réouverture du fichier en lecture (sous Unix) !!! Je vais donc tenter de modifier ma fonction de lecture pour supprimer les \r.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void StringList::LoadFromFile(string nom_fichier)
    {
    this->Clear();
    std::ostringstream stream; 
    std::string str; 
    std::ifstream fichier(nom_fichier.c_str()); 
    while( std::getline( fichier, str ) )
       this->Add(str);
    }
    Je laisse le sujet ouvert, pour y rajouter par la suite la solution complète (suppression des \r lors de la lecture). D'ailleurs si vous avez des idées, je suis aussi preneur !

  13. #13
    Membre régulier Avatar de benj63
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 207
    Points : 99
    Points
    99
    Par défaut
    donc voici ma solution...

    Une ptite fonction StrPos pour chercher la position d'un caractère (ou d'une chaine de caractères) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int StrPos(string caractere, string chaine)
    {
    int pos;
    pos=chaine.find(caractere);
    if(pos!=-1)
       pos=pos+1;  // pour assurer la compatibilité avec mes codes C++ Builder...
    return pos;
    }

    Une fonction StrReplace pour remplacer un caractère (ou une chaine) par un(e) autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    string StrReplace(string chaine, string avant, string apres)
    {
    int pos;
    pos=StrPos(avant, chaine);
    while(pos!=-1)
    {
       chaine.replace(pos-1, avant.length(), apres);
       pos=StrPos(avant, chaine);
    }
    return chaine;
    }

    La nouvelle fonction de lecture des fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void StringList::LoadFromFile(string nom_fichier)
    {
    this->Clear();
    std::ostringstream stream; 
    std::string str; 
    std::ifstream fichier(nom_fichier.c_str()); 
    while(std::getline( fichier, str ))
       this->Add(StrReplace(str, "\r", ""));
    }

    et pour finir, la nouvelle fonction d'écriture des fichiers :

    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
    void StringList::SaveToFile(string nom_fichier)
    {
    std::ofstream fe (nom_fichier.c_str());
    int i;
    if(fe!=NULL)
    {
       i=0;
       while(i<this->Count)
       {
          fe << this->Strings[i].c_str() << "\r\n";
          i++;
       }
    }
    fe.close();
    }
    Bon, ça ne doit pas être super optimisé, mais ça fonctionne... et c'est le principal pour moi, pour l'instant !

    Merci à tous ceux qui m'ont aidé !

  14. #14
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    En post-it, la méthode pour retirer toutes les occurrences d'un caractère est donnée. En plus optimal, c'est même un trim_right dont tu pourrais te contenter.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. [XSLT 1.0] Impossible de convertir le type d'argument/de retour dans la méthode
    Par kevin8100 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 27/06/2011, 23h24
  2. conversion retour chariot UNIX > DOS - DOS > UNIX
    Par knebhi dans le forum Langage
    Réponses: 1
    Dernier message: 27/12/2009, 18h35
  3. enregistrer retour commande unix dans variable
    Par tisba972 dans le forum Langage
    Réponses: 2
    Dernier message: 30/07/2008, 08h40
  4. Retour chariot dans un scanf sous windows
    Par TekFanatiX dans le forum Débuter
    Réponses: 5
    Dernier message: 03/02/2008, 07h06
  5. ksh, retours de fonctions et retour chariot
    Par Seboss dans le forum Linux
    Réponses: 1
    Dernier message: 05/04/2007, 16h12

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