2013-01-20 59 views
0

为什么ifstream在读取指定文件的最后一行后将failbit设置为1?如何知道指定的文件是否被正确读取?如何知道指定文件是否被正确读取?

bool read_csv_file(const char* filename, vector<string>& lines, bool adding = false) 
{ 
    if(!adding) lines.clear(); 

    ifstream csvfile; 
    csvfile.open(filename); 

    if(csvfile.is_open()) 
    { 
     string line; 
     while(csvfile.good() && getline(csvfile,line)) 
     { 
      lines.push_back(line); 
      cout << "fail: " << csvfile.fail() << endl; 
     } 
     cout << "fail: " << csvfile.fail() << endl; 
     csvfile.close(); 
     return (!csvfile.fail()); 
    } 

    return false; 
} 
+0

您的代码*远*太吵。你可以简单地说'ifstream csvfile(filename); if(!csvfile){/ * error */return false; }'并摆脱你的大部分代码。 –

回答

1

failbit可以在读取最后的 行(或任何行)之后设置的唯一原因是库中有错误,而我不太相信它。如果设置了failbit,则表示 您没有读取任何内容。在你的情况下,当你在循环中时,它永远不会被设置为 ;如果它被设置,getline将 评估为false,你不会进入循环。 当然,循环终止,正是因为getline 失败(或者将无法—通常情况下,你会测试 good做输入之前,如果你这样做,认为 failbit设置,不管,如果测试失败)。

对于这样的事情通常的模式是:

while (someInput) { 
    // ... 
} 
if (csvfile.bad()) { 
    // Serious error (disk read error, etc.)... 
} else if (! csvfile.eof()) { 
    // Formatting error... 
} else { 
    // Normal end of file... 
} 

someInputstd::getline(),但是,因为格式错误,你将永远不会 失败,所以else if上面会 永远是真实的(和很多代码将硬盘错误看作是 它们是文件的结尾,因此也忽略了if部分)。

+0

好的,它的工作原理!我应该在'loop'之后关闭文件,但是在执行最终检查之前('csvfile.bad()'和'!csvfile.eof()')? – enzom83

+0

@ enzom83通常不需要输入。 (对于输出,是的,因为您必须在关闭后测试文件的状态,以确保所有数据都确实传输到操作系统。) –

2

的失败,你逃跑后的文件的末尾位。一旦发生这种情况,您不得试图解释您的输入操作的结果。然而,这很好,并且getline不会设置失败位,而仍然有任何数据被读取。所以下面的标准循环extracts all the lines

for (std::string line; std::getline(csvfile, line);) 
{ 
    // process "line" 
} 

// all done 
1

过检查错误读取,必须使用stream.bad()测试badbit

Failbit表示操作逻辑失败,显然getline在到达EOF(在我的机器上确认)时设置它。

+0

这是完全错误的(一般来说,你几乎从不会看到'badbit')。 –

相关问题