Comment puis-je lire de la mémoire comme d'un fichier en utilisant wistream?
-
08-10-2019 - |
Question
Dans mon précédent question j'ai demandé comment lire une mémoire comme d'un fichier. Parce que mon dossier entier était en mémoire que je voulais lire la même façon.
Je trouve réponse à ma question, mais en fait je besoin de lire des lignes comme wstring
. Avec le fichier que je peux faire ceci:
wifstream file;
wstring line2;
file.open("C:\\Users\\Mariusz\\Desktop\\zasoby.txt");
if(file.is_open())
{
while(file.good())
{
getline(file,line2);
wcout << line2 << endl;
}
}
file.close();
Même si le fichier est en ASCII.
En ce moment, je change simplement ma ligne de string
à wstring
avec une fonction cette réponse . Cependant, je pense que s'il y a un moyen de traiter cette partie de la mémoire comme un wistream
ce serait une solution plus rapide pour obtenir ce que les lignes wstring
s. Et j'ai besoin que ce soit rapide.
Quelqu'un sait comment traiter cette partie de la mémoire comme wistream
?
La solution
Je suppose que vos données sont déjà converties en l'encodage désiré (voir la réponse @detunized).
Utilisation insistent sur le fait ne pas utiliser boost alors la conversion se déroule comme suit (toujours tout droit):
class membuf : public wstreambuf // <- !!!HERE!!!
{
public:
membuf(wchar_t* p, size_t n) { // <- !!!HERE!!!
setg(p, p, p + n);
}
};
int main()
{
wchar_t buffer[] = L"Hello World!\nThis is next line\nThe last line";
membuf mb(buffer, sizeof(buffer)/sizeof(buffer[0]));
wistream istr(&mb);
wstring line;
while(getline(istr, line))
{
wcout << L"line:[" << line << L"]" << endl;
}
}
Voir également ce pourquoi utiliser UTF char
plaine -8 cours d'eau.
Autres conseils
Vous ne pouvez pas traiter chaîne ASCII comme une chaîne UNICODE, puisque les personnages qu'ils contiennent ont des tailles différentes. Donc, vous auriez à faire une sorte de conversion vers un tampon temporaire et ensuite utiliser ce morceau de mémoire comme un tampon d'entrée pour votre flux. C'est ce que vous faites en ce moment.
Il devrait être évident que si vous avez string
, istream
et istringstream
donc vous aussi wstring
, wistream
et wistringstream
.
Les deux istringstream
et wistringstream
sont juste spécialisation de la classe de modèle basic_istringstream
pour l'omble chevalier et wchar respectivement.