2016-10-28 4 views
4

Привет мне нужно прочитать файл, который выглядит следующим образом ...C++ как читать строку с разделителем до конца каждой строки?

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 

Как вы можете видеть тип каждого фильма может варьироваться от 1 типа для многих ... Интересно, как я не мог читать их пока конец каждой строки?

Я сейчас делаю:

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; 
    } 
} 

результат не то, что я хочу ... Это выглядит следующим образом:

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

Так что не остановится в конце каждой строки ... Как я могу это исправить?

+1

Читать жанровую часть без указания разделителя (то есть, используя разделитель по умолчанию '«\ n''), а затем разделить результат с '» | ''. – Leon

+0

Код делает именно то, что вы просили. Что вы ожидаете?? – UmNyobe

+0

@ Leon спасибо! Какую функцию следует использовать для разделения результата на «|»? – weeo

ответ

0

Спасибо, ребята, я использовал istringstream. Оно работает.

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

Попытка разобрать этот входной файл по одному полю за раз - неправильный подход.

Это текстовый файл. Текстовый файл состоит из строк, завершаемых символами новой строки. getline() само по себе, является то, что вы используете для чтения текстового файла, с новой строки с концевыми линиями:

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

И не:

while(!myfile.eof()) 

which is always a bug.

Итак, теперь у вас есть цикл, который читает каждую строку текста. std::istringstream может быть построен внутри цикла, содержащая строку только для чтения:

std::istringstream iline(line); 

, а затем вы можете использовать std::getline(), с этим std::istringstream с дополнительным символом разделителя перекрываться, чтобы '|' читать каждое поле в строке.