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 wstrings. Et j'ai besoin que ce soit rapide.

Quelqu'un sait comment traiter cette partie de la mémoire comme wistream?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top