C++ C++;:getline()忽略前几个字符
在我的程序中,C++ C++;:getline()忽略前几个字符,c++,ifstream,getline,C++,Ifstream,Getline,在我的程序中,fin是一个ifstream对象,song是一个字符串 程序运行时,会打开music.txt并读取文件。我试着读每一行:getline(fin,song) 我尝试了getline的所有变体,但在开始提取字符之前,它一直忽略每行的前10个左右字符。例如,如果歌曲名为“songname”,它可能只拾取“songname” 有什么想法吗 以下是简化代码: void Playlist::readFile(ifstream &fin, LinkedList<Playlist&
fin
是一个ifstream
对象,song
是一个字符串
程序运行时,会打开music.txt并读取文件。我试着读每一行:getline(fin,song)代码>
我尝试了getline
的所有变体,但在开始提取字符之前,它一直忽略每行的前10个左右字符。例如,如果歌曲名为“songname”,它可能只拾取“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;
}
.....}
void Playlist::readFile(ifstream&fin、LinkedList&allPlaylists、LinkedList&library)
{
弦乐曲;
财务公开(“music.txt”);
if(fin.fail())
{
不能固定版本:
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()的测试
。如果可以读取更多内容,则不能将其用于测试,也不能将其用于测试上一次读取是否成功。通过检查失败标志,或者通常通过测试流本身,可以验证先前的操作是否成功。尝试一下这种方法
...
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;
}
}
}
。。。
其他的
{
而(财务)
{
getline(fin,song);//先读
如果(!fin.eof()&&flag)//检测eof在这里是有意义的,因为
{//eof只有在读取后才能检测到
无法发布最小的可编译源代码。另外,请注意,通常不需要进行太多检查:while(getline(fin,song)){…}
就足够了。您的标志
变量没有设置。我使用了“标志”在简化代码时初始化失败。这应该是真的。您看到上面的getline语法/用法有什么错误吗?没有,看起来不错。在发布之前简化代码时,您是否删除了任何包含fin的行。特别是,其余{}块中有什么?