繁体   English   中英

从“ getline”之后的文件读取第一行时出现问题

[英]Problems reading first line from file after '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函数获取用户输入的人员打交道。 任何想法将不胜感激。

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

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

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

下面的代码没有任何跳行,仅对“ ABN”行执行相同的读取:

// 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行时),因为它们在缓冲和空白处理方面的行为略有不同。 如果您确实需要,请搜索此主题-有很多示例如何同步它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM