C ++: getline () игнорирует первые несколько символов - PullRequest
0 голосов
/ 11 марта 2010

В моей программе fin - это объект ifstream, а song - это string.

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

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

Любые идеи?

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

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

Ответы [ 2 ]

0 голосов
/ 04 апреля 2013

Попробуй таким образом,

...
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;
        }
    }
}
0 голосов
/ 11 марта 2010

Фиксированная версия:

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(). Вы не можете использовать это для тестирования, если вы можете читать больше, и вы также не можете использовать это для тестирования, было ли предыдущее чтение успешным или нет. Проверка успешности более ранней операции может быть выполнена путем проверки флага сбоя или чаще всего путем тестирования самого потока.

...