2010-06-07 5 views
1

Quelle est la manière correcte de lire les fichiers Unicode ligne par ligne en C++? J'essaie de lire un fichier enregistré en tant qu'unicode (LE) par le bloc-notes de Windows. Supposons que le fichier contienne simplement les caractères A et B sur des lignes séparées.Lecture de fichiers Unicode ligne par ligne C++

À la lecture de l'octet de fichier par octet, je vois la séquence d'octet suivant (hex):

FE FF 41 00 0D 00 0A 00 42 00 0D 00 0A 00

So 2 octets BOM, 2 octets "A", 2 octets CR, 2 octets LF, 2 octets "B", 2 octets CR, 2 octets LF.

J'ai essayé de lire le fichier texte en utilisant le code suivant:

std::wifstream file("test.txt"); 
    file.seekg(2); // skip BOM 
    std::wstring A_line; 
    std::wstring B_line; 
    getline(file,A_line); // I get "A" 
    getline(file,B_line); // I get "\0B" 

-je obtenir les mêmes résultats en utilisant >> opérateur au lieu de getline

file >> A_line; 
    file >> B_line; 

Il semble que le caractère CR seul octet est est consommé uniquement sous la forme d'un octet unique. ou CR NULL LF est en cours de consommation mais pas le haut octet NULL. Je m'attendrais à ce que wifstream en mode texte lise le 2 octets CR et 2 octets LF.

Qu'est-ce que je fais mal? Il ne semble pas correct que l'on doive lire un fichier texte octet par octet en mode binaire juste pour analyser les nouvelles lignes.

Répondre

5

std::wifstream expose le jeu de caractères large à votre programme, qui est généralement UCS-2 sous Windows et UTF-32 sous Unix, mais suppose que le fichier d'entrée utilise toujours des caractères étroits. Si vous voulez qu'il se comporte en utilisant des caractères larges sur le disque, vous devez utiliser une facette std::codecvt<wchar_t, wchar_t>.

Vous devriez juste être en mesure de trouver l'implémentation de votre compilateur std::codecvt<char, char> qui est également une facette de conversion de code non-conversion, et changez les caractères en wchar_ts.

Questions connexes