C ++:getline()忽略前几个字符

时间:2010-03-10 23:25:45

标签: c++ ifstream getline

在我的计划中,finifstream个对象,songstring

程序运行时,会打开music.txt并从文件中读取。我尝试用getline(fin,song);

读取每一行

我已尝试getline的所有变体,但它在开始拾取字符之前一直忽略每行的前10个字符。例如,如果歌曲名称是“songsongsongsongsongname”,它可能只会选择“歌名”。

有什么想法吗?

以下是简化代码:

 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 :(得分: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()的测试。如果您可以阅读更多内容,则无法使用它进行测试,也无法使用它来测试先前的读取是否成功。验证早期操作是否成功可以通过检查失败标志来完成,或者最常通过测试流本身来完成。

答案 1 :(得分: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;
        }
    }
}