在'getline'之后从文件中读取第一行的问题

时间:2013-02-07 08:40:19

标签: c++ getline

输入getline后,输入文件中的第一行数字将被忽略,程序将从第二行开始直到结束。

以下是代码:

while (!file.eof())
{
    getline(file, lineBuffer);
    if(lineBuffer.length()==0)
    {
        continue; //ignore empty lines
    }
    else 
    {
       // file.open("test.txt");
        while (file >> A >> B >> N)
        {

            for(int count=1; count<=N; count++)
            {
                if(count%A == 0 && count%B == 0) { cout << "FB "; }

                else if(count%A == 0) { cout << "F "; }

                else if(count%B == 0) { cout << "B "; }

                else { cout << count << " "; }

            }
            cout << endl;
        }
    }
}

输入文件包含3行整数,只处理第二行和第三行。我对此进行了广泛的研究,但没有人提到类似我的案例。通常他们会处理在getline函数之后尝试获取用户输入的人。任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:1)

getline(file, lineBuffer)file读取一行并将其存储在lineBuffer中。如果您想使用它,则应该处理lineBuffer而不是从file读取(其中第一行已被跳过)。要使其工作,只需删除内部while之外的所有代码。这将一次从文件中读取3个数字,当提取其中一个数据失败时停止。

答案 1 :(得分:0)

以上代码是真实的还是一个例子?

如果它是真的,你不需要跳过那些空洞的线条。运营商&gt;&gt;将为您跳过空格。

以下没有任何换行的代码执行“A B N”行的相同读取:

// outer loop is not needed, either remove it, or include error checking
// while (!file.eof() && !file.fail())
{
    while (file >> A >> B >> N)
    {
        for(int count=1; count<=N; count++)
        {

            if(count%A == 0 && count%B == 0) { cout << "FB "; }
....

如果由于某种原因你根本无法移除getline,请记住getline读取ALWAYS行(除非streampointer到达它的末尾)。这意味着您的代码跳过空行,然后读取第一个非空行,注意该行不为空并打破循环。请注意,已读取行,因此,您的第一行数据现在位于行缓冲区中,而不再位于流中。现在您必须取消整行(如果您的流支持它)或按行长度回放流(如果您的流支持它)或 - 只需阅读行中的数据 - 例如使用 istringstream 类。

通常,混合getline和运算符&gt;&gt;是可行的但是很棘手,(特别是当你第一次通过&gt;&gt;阅读然后想要跳过1或2行时),因为它们在缓冲和空格处理方面的表现略有不同。如果你真的想要这个,请搜索这个主题 - 有很多例子如何同步它们。