problème à l'aide de getline avec un fichier unicode

Mise à JOUR: Merci à @Potatoswatter et @Jonathan Leffler pour commentaires - plutôt embarrassante j'ai été surpris par l'outil de débogage de la pointe ne montrant pas la valeur d'un wstring correctement - mais il n'est toujours pas assez de travail pour moi et j'ai mis à jour la question ci-dessous:

Si j'ai un petit multi-octets du fichier que je veux lire une chaîne de caractères-je utiliser l'astuce suivante - je utiliser getline avec un délimiteur de '\0' par exemple

std::string contents_utf8;
std::ifstream inf1("utf8.txt");
getline(inf1, contents_utf8, '
std::string contents_utf8;
std::ifstream inf1("utf8.txt");
getline(inf1, contents_utf8, '\0');
'
);

Ce lit dans l'ensemble du dossier, y compris les retours à la ligne.

Cependant, si j'essaie de faire la même chose avec un caractère large de fichier ne fonctionne pas - mon wstring ne lit à la première ligne.

std::wstring contents_wide;
std::wifstream inf2(L"ucs2-be.txt");
getline( inf2, contents_wide, wchar_t(0) ); //doesn't work

Par exemple si mon fichier unicode contient les caractères A et B séparés par un CRLF, la tête ressemble à ceci:

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

Basé sur le fait que, avec un multi-octets du fichier getline avec '\0' lit le fichier en entier j'ai cru que getline( inf2, contents_wide, wchar_t(0) ) peut lire l'intégralité du fichier unicode. Cependant, il n'est pas - avec l'exemple au-dessus de ma grande chaîne contiendra les deux wchar_ts: FF FF

(Si je retire la wchar_t(0) on lit à la première ligne, comme prévu (c'est à dire FE FF 00 41 00 0D 00)

Pourquoi ne pas wchar_t(0) travaillent en délimitant wchar_t de sorte que getline s'arrête sur 00 00 (ou lit à la fin du fichier, qui est ce que je veux)?

Merci

  • Le multi-octets fichier doit lire à '\n', n'est-ce pas? Idem pour les caractères larges de la version, il convient de lire pour le grand caractère de saut de ligne.
  • UCS-2 ne devrait pas faire de traduction, de sorte qu'il ne peut pas être la machine de l'etat. Cela fonctionne correctement si vous n'avez pas de \0 s?
  • Leffler la MO fichier se lit à l'EOF (y compris \n) parce que j'ai dit que le délimiteur de s'arrêter sur est 0
  • même résultat pour le widechar version résultat, si je retire la whar_t(0) arrête la lecture à la première de 0 octet.
  • non, je veux dire ce qui se passe si il n'y a pas de 0 octets dans le fichier. Aussi, n'est-ce pas "arrêt de la lecture à la première de 0 octet" ce que vous avez demandé? Il serait utile si vous avez été plus précis. Faut-il agir comme le 0 de l'octet est la fin du fichier? Ce n'est pas ce que votre description ressemble.
  • La Correction (j'ai été surpris par le débogueur pas en me montrant la chaîne correctement) si je retire la wchar_t(0) ensuite, il lit à la fin de la première ligne que l'on pourrait attendre

InformationsquelleAutor hamishmcn | 2010-04-27