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 :

Un probl�me avec une std::string


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2013
    Messages
    113
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par d�faut Un probl�me avec une std::string
    Salut � tous,

    je cherche � passer sur mac un code d�velopp� sur windows.

    J'ai commenc� par �tre confront� � une diff�rence concernant les chemins relatifs que j'ai r�gl� avec _NSGetExecutablePath.

    Maintenant je me retrouve avec un comportement �trange sur une std::string (il n'y a peu �tre aucun rapport avec le passage sur mac mais �a fonctionnait sous windows alors je pr�f�re vous le dire).

    Mon probl�me est le suivant : je lis dans un fichier le nom d'un autre fichier � l'aide de la fonction :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    string readFileName(string fileName, string tag)
    {
        string line;
        string result;
        string balise = string(tag);
     
        ifstream file(fileName, ios::in);
     
        if(file)
        {
            while(!file.eof())
            {
                getline(file, line);
     
                if (line.find(balise) != string::npos)
                {
                    result = line.substr(balise.length()+3);
                }
            }
        }
     
        file.close();
     
        return result;
    }
    Ma std::string est bien lu mais je ne peut pas la modifier sans comportements �tranges.

    Admettons que mon fichier soit : monFichier.txt.

    Si, par exemple, je veux l'afficher encadr� par deux lettres :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    cout << "a" << fileName << "b" << endl;
    j'obtiens : bonFichier.txt (le m � �t� remplac� par le a puis par le b je suppose).

    Si j'avais �cris :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    cout << "a" << fileName << "bbb" << endl;
    j'aurais obtenu : bbbFichier.txt

    Et si j'avais voulu concat�ner deux std::string :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    fileName += string("b");
    cout << fileName << endl;
    ou encore

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    fileName.append(string("b"));
    cout << fileName << endl;
    j'aurais obtenu dans les deux cas : bonFichier.txt.

    Est ce que ce comportement vous dit quelque chose ?

    Un grand merci d'avance pour votre aide.

  2. #2
    Expert �minent

    Femme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par d�faut
    Ce sont tes fins de lignes.
    Il y a deux caract�res de fin de lignes: CR (carriage return) et LF (line feed).
    J'ai l'impression que tu es bien revenu au d�but de la ligne, mais que tu n'es pas pass� � la suivante.

    Or, et c'est l� l'astuce, windows utilise CR suivi de LF comme passage � la ligne suivante, tandis que les Mac n'utilise que CR. (Et linux uniquement LF)

    Il est inutile de pr�ciser ios::in pour un ifstream, par contre, regarde le fonctionnement de iso::binary.

    Une alternative serait serait de changer les fins de lignes du fichier. Pour linux, il y a dos2unix, j'imagine que la m�me chose existe pour mac

  3. #3
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2013
    Messages
    113
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par d�faut
    Merci beaucoup pour cette r�ponse encore une fois tr�s instructive. Je ne savais pas qu'il y avait une diff�rence dans la lecture des fichiers entre Windows, Linux et Mac.

    J'ai fait fonctionner ma lecture en cherchant le nom de mon fichier entre des guillemets ("fileName.txt" en me servant des guillemets comme balises).

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    // Fonctionne
    start = line.find("\"");
    end = line.find("\"",start+1);
    result = line.substr(start+1, end - (start+1));
    J'avoue ne pas vraiment comprendre car j'ai essayer de faire de m�me entre des guillemets " et la balise \n mais cela ne fonctionne pas.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    // Ne fonctionne pas
    start = line.find("\"");
    end = line.find("\n",start+1);
    result = line.substr(start+1, end - (start+1));
    Qu'est ce qui se cache deri�re les CR et LF ?

    Sous Windows : \n = CR+LF
    Sous Linux : \n = LF
    Sous Mac : \n = CR

    C'est �a ?

    J'ai aussi regard� rapidement du cot� de ios::binary mais je n'ai vu aucunes diff�rences de r�sultats.

  4. #4
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    CR -> "\r".
    LF -> "\n".

    ios::binary sur Linux (et je suppose Mac) ne fait rien. Il n'y a pas de diff�rente entre ouvrir en mode binaire ou en mode texte.

    Si le texte est affich� sur la console, il faut utiliser "\n" pour les sauts de ligne, "\r" permettant de revenir au d�but de la ligne. � v�rifier en affichant des cha�nes comme "ab\rc" et "ab\nc".

    Un moyen rapide de supprimer les caract�res ind�sirables est d'utiliser std::remove. Le plus simple reste quand m�me d'avoir des fichiers dans le bon format. Sans �quivalent de dos2unix, il y a toujours sed (sed s'/^\n//g', pas essay�).

  5. #5
    Membre confirm�
    Homme Profil pro
    �tudiant
    Inscrit en
    Mai 2013
    Messages
    113
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par d�faut
    Effectivement, tu as raison :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    start = line.find("\"");
    end = line.find("\r",start+1);
    result = line.substr(start+1, end - (start+1));
    fonctionne et

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    result = line.substr(balise.length()+3);
    result.erase(remove(result.begin(),result.end(),'\r'),result.end());
    fonctionne �galement.

    Je vais utiliser l'une de ces solutions pour le moment, j'�tudierai plus en d�tail ios::binary, dos2unix et sed dans un second temps.

    Merci beaucoup pour votre aide pr�cieuse.

  6. #6
    Membre �prouv�
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par d�faut
    Citation Envoy� par kipgon Voir le message
    J'ai commenc� par �tre confront� � une diff�rence concernant les chemins relatifs que j'ai r�gl� avec _NSGetExecutablePath.
    Tu aurais mieux fait d'utiliser boost::filesystem.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 14/06/2010, 15h21
  2. probl�me avec une variable de type string
    Par marsupilami34 dans le forum Macros et VBA Excel
    R�ponses: 3
    Dernier message: 14/06/2007, 14h53
  3. Probl�me de fonction "const" avec une std::map
    Par Clad3 dans le forum SL & STL
    R�ponses: 3
    Dernier message: 02/01/2007, 12h38
  4. probl�me avec une date/string dans un CommandText
    Par critok dans le forum Bases de donn�es
    R�ponses: 5
    Dernier message: 09/02/2005, 15h30
  5. Probl�me avec une proc�dure stock�e
    Par in dans le forum Langage SQL
    R�ponses: 4
    Dernier message: 27/05/2003, 15h33

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