1

输入后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函数之后获得用户输入的人。任何想法将不胜感激。

4

2 回答 2

2

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

于 2013-02-07T08:45:01.837 回答
0

上面的代码是真实的还是示例?

如果它是真实的,则无需跳过空行。运算符>> 将为您跳过空格。

以下没有任何换行的代码对“AB 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 始终读取该行(好吧,除非流指针到达其末尾)。这意味着您的代码会跳过空行,然后读取第一个非空行,注意到该行不为空并中断循环。请注意,它已读取 line,因此,您的第一行数据现在位于linebuffer中,而不再位于流中。现在您必须取消整行(如果您的流支持它)或按行的长度倒回流(如果您的流支持它),或者 -只需从行中读取数据- 例如使用istringstream类。

通常,混合 getline 和 operator>> 是可行的,但很棘手,(尤其是当您首先通过 >> 阅读然后想要跳过 1 或 2 行时),因为它们在缓冲和空白处理方面的行为略有不同。如果您真的想要,请搜索此主题 - 有很多示例如何同步它们。

于 2013-02-07T08:46:04.020 回答