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?
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
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());
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
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)
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 if(std::wifstream file{m_FilePath}) { file.imbue(std::locale("UTF-8")); ...
Mais du coup la lecture du fichier renvoie un un flux vide. if(file.is_open() renvoie bien vrais.
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(); }
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![]()
Partager