在我的计划中,fin
是ifstream
个对象,song
是string
。
程序运行时,会打开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;
}
.....}
答案 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;
}
}
}