Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:getline()忽略前几个字符_C++_Ifstream_Getline - Fatal编程技术网

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的行。特别是,其余{}块中有什么?