2013-02-07 64 views
1

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

+0

您是否检查了'linebuffer'数据?和'test.txt'中是什么? – 2013-02-07 08:43:05

+0

你能显示一个示例输入文件吗? –

+0

关于这个问题有上千个问题:-(在测试'eof()'之前,你必须尝试获取一些数据,当你使用'getline'时,检查结果是否成功。行也会抛弃'lineBuffer'内容,您在其中找到'lineBuffer.length()!= 0' ...,它包含您缺少的第一组A,B,N结果。 'while(file >> A ...)''循环,它会开始工作,你可能想要(你没有说你期望的,但我认为它是处理第一行) –

回答

1

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

+0

首先,我忘了提及这是一个编码对我尝试的CodeEval挑战。我的印象是,这个测试用例代码是不可避免的,必须在那里,但我相信它只是可选的......以下是来自提交页面的代码输入窗口的代码: /*示例代码在测试用例中: ifstream文件; (file.of()) getline(file,lineBuffer); if(lineBuffer.length()== 0) continue; //忽略所有的空行 其他 {// 做的东西在这里 } } */ –

+0

@StephenPaul如果您使用的代码模板,那么您需要处理'lineBuffer'而不是从'file'阅读更多的数字。 – Angew

0

上述代码是真实还是示例?

如果它是真实的,则不需要跳过空行。操作员>>将跳过你的空格。

没有任何lineskipping下面的代码执行只是“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读取的行ALWAYS(当然,除非流指针达到了结尾)。这意味着你的代码跳过空行,然后读取第一个非空行,注意行不是空的并打破循环。请注意,它已读取行,因此,您的第一行数据现在位于行缓冲区中,而不再在流中。现在你必须要么没有记录整个行(如果你的流支持它)或回倒流的行长(如果你的流支持它)或 - 只读取行的数据 - 例如使用istringstream类。

一般来说,混合getline和operator >>是可行但棘手的(特别是当你第一次通过>>然后想跳过1或2行时),因为它们在缓冲方面表现有点不同,空格处理。如果你真的想要这个,请搜索这个主题 - 有很多示例如何同步它们。

+0

提示OP:要混合它们,你通常会继续使用getline将行读入到一个字符串中,然后使用该字符串初始化一个“istringstream”,从中解析出你的每行值.... –

+0

我会放弃'而(!file.eof())'。你第一次输入它总是如此。第二次,如果读取失败的文件结束以外的东西,你有一个无限循环。 –

+0

啊,对,errorflags ..我会更新代码 – quetzalcoatl

相关问题