在C++中导致EOF检查失败的文件末尾的空格

问题描述:

我正在读取具有三列的文件中的数据。例如,数据看起来是这样的:在C++中导致EOF检查失败的文件末尾的空格

3 START RED 
4 END RED 

在数据读取我使用下面的检查:

while (iFile.peek() != EOF) { 
    // read in column 1 
    // read in column 2 
    // read in column 3 
} 

我的问题是,循环通常做一个额外的循环。我很确定这是因为很多文本编辑器似乎在实际内容的最后一行之后放置了一条空行。

我做了一些谷歌搜索和搜索所以发现了一些类似的情况,如Reading from text file until EOF repeats last line但是我似乎无法适应给解决我的问题的解决方案。有什么建议么?

。假定iFileistream

你应该摆脱对循环任何错误,不但对EOF(可以用iFile.eof(),BTW被检查),因为这是一个死循环任何格式错误都会将流设置为EOF以外的错误状态。在读取所有内容(无论是否成功)以及输入之前,通常需要打破循环中间的读取循环。

要确保有不来了什么有趣的,你可以,在循环之后,复位流状态,然后尝试空白只读,直到你到达EOF:

while(!iFile.eof()) 
{ 
    iFile >> std::ws; 
    string line; 
    std::getline(iFile,line); 
    if(!line.empty()) error(...); 
} 
+0

+1来反击愚蠢的匿名驱动器downvoter。 – 2012-02-03 18:15:36

如果任何读取失败(读取列数据的地方),请跳出while循环。大概你是在文件的末尾,并阅读最后的'不正确'的行

+0

我该如何去检查读取是否失败?只需检查一下,看看读入的值是否为接受值?如果是这样,我不会这样做,因为它无法读取新数据时,它只会将旧数据留在变量中。有没有其他的方式来检查这个? – blcArmadillo 2009-10-27 08:06:36

+0

EOF将被设置。但就像其他人所说的那样:只要一行一行地去解析这些值就行了,而不是连续读取 – Toad 2009-10-27 08:24:36

也许你会认为这是一个好主意,然后处理空白和其他无效输入。也许对1,2,3列的一些基本验证也是可取的。

不要担心循环次数:只验证您的数据并处理无效输入。

基本上,检查你有三列要阅读,如果你不确定是否因为该文件已结束或由于其他问题。

EOF不是预测但是错误状态。因此,像你使用它,现在,你不能用它来预测你是否可以读取列1,2和3。由于这个原因,在C++中常见的模式是:

while (input >> obj1 >> obj2) { 
    use(obj1, obj2); 
} 

所有operator>>(istream& is, T&)回报输入流,并且当在布尔上下文中使用时,只要最后的提取成功,流是“真”的。然后使用提取的对象是安全的。