2010-03-10 7 views
0

В моей программе fin является объектом ifstream, а song является string.C++: getline() игнорирование первых нескольких символов

Когда программа запускается, она открывает music.txt и читает из файла. Я стараюсь читать каждую строку с помощью: getline(fin,song);

Я пробовал все варианты getline, но он игнорирует первые 10 или около того символов каждой строки до того, как начнет собирать символы. Например, если название песни - «songongsongsongsongname», это может только подобрать «имя песни».

Любые идеи?

Вот упрощенный код:

void Playlist::readFile(ifstream &fin, LinkedList<Playlist> &allPlaylists, LinkedList<Songs*> &library) 
{ 
    string song; 
    fin.open("music.txt"); 
    if(fin.fail())   
    { 
     cout << "Input file failed. No saved library or playlist. Begin new myTunes session." << endl << endl; 
    } 
    else 
    { 
     while(!fin.eof() && flag) 
     { 
       getline(fin, song);  
       cout << song << "YES." << endl; 
       } 
.....} 
+1

сообщение минимальный компилируемый источник. Также обратите внимание, что так много проверок обычно не требуется: 'while (getline (fin, song)) {...}' достаточно хорошо. – dirkgently

+0

Ну, ваша переменная 'flag' не установлена. –

+0

Я взял инициализацию «flag», когда вы упрощаете код. Это должно быть правдой. Вы видите что-то не так с синтаксисом getline/use выше? – Gabe

ответ

0

Исправленная версия:

void Playlist::readFile(std::string const& filename, ...) { 
    std::ifstream fin(filename.c_str()); 
    if (!fin) throw std::runtime_error("Unable to open file " + filename); 
    for (std::string song; std::getline(fin, song);) { 
     ... 
    } 
} 

Самое главное я удалил испытание .eof(). Вы не можете использовать это для тестирования, если можете прочитать больше, и вы также не можете использовать его для проверки того, было ли предыдущее чтение успешным или нет. Проверка успешности предыдущей операции может быть выполнена путем проверки флажка сбоя или, чаще всего, путем тестирования самого потока.

0

Дайте попробовать на этом пути,

... 
else 
{ 
    while(fin) 
    { 
     getline(fin, song); //read first 
     if(!fin.eof() && flag) //detecting eof is meaningful here because 
     {      //eof can be detected only after it has been read 
      cout << song << "YES." << endl; 
     } 
    } 
} 
Смежные вопросы