web-dev-qa-db-fra.com

C++ comment lire une ligne avec un délimiteur jusqu'à la fin de chaque ligne?

Bonjour, j'ai besoin de lire un fichier qui ressemble à ceci ...

1|Toy Story (1995)|Animation|Children's|Comedy
2|Jumanji (1995)|Adventure|Children's|Fantasy
3|Grumpier Old Men (1995)|Comedy|Romance
4|Waiting to Exhale (1995)|Comedy|Drama
5|Father of the Bride Part II (1995)|Comedy
6|Heat (1995)|Action|Crime|Thriller
7|Sabrina (1995)|Comedy|Romance
8|Tom and Huck (1995)|Adventure|Children's
9|Sudden Death (1995)|Action

Comme vous pouvez le constater, le type de chaque film peut varier d’un type à un autre ... Je me demande comment je pourrais les lire jusqu’à la fin de chaque ligne?

Je suis en train de faire:

void readingenre(string filename,int **g)
{

    ifstream myfile(filename);
    cout << "reading file "+filename << endl;
    if(myfile.is_open())
    {
        string item;
        string name;
        string type;
        while(!myfile.eof())
        {
            getline(myfile,item,'|');
            //cout <<item<< "\t";
            getline(myfile,name,'|');
            while(getline(myfile,type,'|'))
            {
                cout<<type<<endl;
            }
            getline(myfile,type,'\n');
        }
        myfile.close();
        cout << "reading genre file finished" <<endl;
    }
}

le résultat n'est pas ce que je veux ... Il ressemble à:

Animation
Children's
Comedy
2
Jumanji (1995)
Adventure
Children's
Fantasy
3
Grumpier Old Men (1995)
Comedy
Romance

Donc, cela ne s'arrête pas à la fin de chaque ligne ... Comment pourrais-je résoudre ce problème?

5
weeo

Merci les gars ... j'ai utilisé istringstream. Ça marche.

getline(myfile,type);
istringstream ss(type);
string temp;
while(getline(ss,temp,'|'))
{
     cout<<temp<<endl;
}
0
weeo

Essayer d'analyser ce fichier d'entrée un champ à la fois est une mauvaise approche.

Ceci est un fichier texte. Un fichier texte est constitué de lignes terminées par des caractères de nouvelle ligne. getline() en lui-même est ce que vous utilisez pour lire un fichier texte, avec des lignes terminées par une nouvelle ligne:

while (std::getline(myfile, line))

Et pas:

while(!myfile.eof())

qui est toujours un bug

Alors maintenant, vous avez une boucle qui lit chaque ligne de texte. Un std::istringstream peut être construit à l'intérieur de la boucle, contenant la ligne à lire:

   std::istringstream iline(line);

vous pouvez ensuite utiliser std::getline(), avec ce std::istringstream avec le caractère facultatif du délimiteur remplacé par '|' pour lire chaque champ de la ligne.

4
Sam Varshavchik