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 :

Pourquoi wifstream n'arrive pas à lire mon fichier générer pas wofstream.


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut Pourquoi wifstream n'arrive pas à lire mon fichier générer pas wofstream.
    Bonjour,

    Voici un petit bout de code de mes tests unitaires avec Critérion.
    J'ai un soucis avec les wostream et wifstream.
    Le fichier généré reste vide si je n'utilise pas la fonction imbue du flux imbue(std::locale("UTF-8").
    Je pensais naïvement que le faite de choisir wostream au lieu d'ostream suffirait à écrire en UTF-8.
    Sauriez-vous pourquoi?

    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
    26
    27
    28
    29
    30
    31
     
        std::wstringstream ss;
        ss << L"[toto]\n";
        ss << L"a=0\n";
        ss << L"path=\\home\\toto\n";
        ss << L"[tata]\n";
        ss << LR"#(pair={L"première", 2})#" << L'\n';
        ss << std::endl;
     
        const auto config_file_path = std::filesystem::current_path() / L"config_load.cfg";
     
        if(std::wofstream out_file{config_file_path})
        {
            out_file.imbue(std::locale("UTF-8"));
            out_file << ss.str();
            cr_assert(out_file.good());
        }
     
        cr_assert(std::filesystem::exists(config_file_path));
     
        API::Config config{config_file_path};
        config.Load();
     
        const auto& datas = config.m_Datas;
     
        const auto tata_key = L"toto"s;
        const auto toto_key = L"toto"s;
     
        cr_assert_eq(datas.size(), 2u,
                     R"#((datas.size() = %zu) != 2u)#",
                     datas.size());
    Si il n'y a pas le imbue de spécifié, le fichier généré est vide et donc le test suivant échoue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /home/toto/blabla/Ma/code/.build/clion_gcc_debug/API/API_UnitTests
    [----] ../../../API/src/Config.ut.cpp:66: Assertion Failed
    [----]   
    [----]   (datas.size() = 0) != 2u
    [----]   
    [FAIL] Config::config_load: (0,60s)
    Par contre pour la lecture je ne peux pas faire ça, sinon le flux reste vide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if(std::wifstream file{m_FilePath})
    {
        file.imbue(std::locale("UTF-8"));
        ...
    Je me suis dit que je me dois de spécifier le imbue avant l'ouverture du fichier. Dommage c'était élégant la déclaration, la porté, l'ouverture et la fermeture directement dans la condition.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            std::wifstream file;
            file.imbue(std::locale("UTF-8"));
            file.open(m_FilePath);
            if(file.is_open())
            {
                file.close();
            }
    Mais du coup la lecture du fichier renvoie un un flux vide. if(file.is_open() renvoie bien vrais.

    Par contre si j'utilise ofstream et une fonction de convertion de l'ANSI*vers l'UTF-8, ça fonctionne… mais bon ça a des limites.

    Auriez-vous une idée?

    En tout cas merci d'avance

  2. #2
    Membre éclairé Avatar de Suryavarman
    Homme Profil pro
    Développeur 3D
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur 3D
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    Ma solution:

    Avant d'utiliser wistream et wostream
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            std::locale loc(std::locale::classic(), new codec_utf8);
            std::wcout.imbue(loc);
            std::locale::global(loc);
    Écriture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        std::wstringstream ss;
        ss << L"[toto]\n";
        ss << L"a=0\n";
        ss << L"path=\\home\\toto\n";
        ss << L"[tata]\n";
        ss << LR"#(pair={L"première", 2})#" << L'\n';
        ss << std::endl;
     
        const auto config_file_path = std::filesystem::current_path() / L"config.cfg";
        if(std::wofstream out_file{config_file_path})
        {
            out_file << ss.str();
        }
    Lecture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        std::wstringstream ss2;
        if(std::wifstream file{config_file_path})
        {
            ss2 << file.rdbuf();
        }
     
        std::wcout << ss2.str() << std::endl;

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/10/2014, 19h14
  2. Créer un fichier vide
    Par Bouguennec dans le forum Pascal
    Réponses: 5
    Dernier message: 08/08/2007, 19h45
  3. Réponses: 4
    Dernier message: 10/08/2006, 01h49
  4. fichier vide ou non
    Par mrtatou dans le forum C
    Réponses: 6
    Dernier message: 07/02/2006, 04h04
  5. Mysqldump donnant un fichier vide
    Par simoryl dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 15/02/2005, 16h42

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