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

C++ 文件末尾的空白导致C+中的EOF检查失败+;,c++,file-io,eof,C++,File Io,Eof,我正在从一个有三列的文件中读取数据。例如,数据将类似于: 3 START RED 4 END RED 要读取数据,我使用以下检查: while (iFile.peek() != EOF) { // read in column 1 // read in column 2 // read in column 3 } 我的问题是这个循环通常会做一个额外的循环。我很确定这是因为很多文本编辑器似乎在实际内容的最后一行后面放了一个空行 我在谷歌上搜索了一下,发现了一些类似

我正在从一个有三列的文件中读取数据。例如,数据将类似于:

3  START  RED
4  END    RED
要读取数据,我使用以下检查:

while (iFile.peek() != EOF) {
   // read in column 1
   // read in column 2
   // read in column 3
}
我的问题是这个循环通常会做一个额外的循环。我很确定这是因为很多文本编辑器似乎在实际内容的最后一行后面放了一个空行


我在谷歌上搜索了一下,发现了一些类似的情况,例如,我似乎无法适应给出的解决方案来解决我的问题。有什么建议吗?

如果任何读取失败(在读取列数据的地方),只需中断while循环。假设您在文件末尾读取最后一行“不正确”

如果任何读取失败(在读取列数据的地方),只需中断while循环即可。假设你是在文件的末尾,读最后一个“不正确的”行

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

也许你会认为处理空白和其他无效输入是一个好主意。也许还需要对第1、2、3列进行一些基本验证。

不要担心循环次数:只需验证数据并处理无效输入即可


基本上,检查您是否有三列要读取,如果您不确定是因为文件结束还是因为其他问题。

不要担心循环次数:只需验证数据并处理无效输入即可


基本上,检查您是否有三列要读,如果您不确定这是因为文件结束还是因为其他问题。

假定
iFile
是一个
istream

您应该在出现任何错误时中断循环,而不仅仅是在EOF(可以使用
iFile.EOF()
,顺便说一句)上,因为当任何格式故障将流设置为EOF以外的坏状态时,这是一个无休止的循环。通常需要在循环的中途读取一个循环,在所有读入(无论成功或否)之前,并在输入之前。p> 为了确保不再有任何有趣的事情发生,您可以在循环后重置流状态,然后尝试仅读取空白,直到达到EOF:

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

假定
iFile
是一个
istream

您应该在出现任何错误时中断循环,而不仅仅是在EOF(可以使用
iFile.EOF()
,顺便说一句)上,因为当任何格式故障将流设置为EOF以外的坏状态时,这是一个无休止的循环。通常需要在循环的中途读取一个循环,在所有读入(无论成功或否)之前,并在输入之前。p> 为了确保不再有任何有趣的事情发生,您可以在循环后重置流状态,然后尝试仅读取空白,直到达到EOF:

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

EOF不是一种预测,而是一种错误状态。因此,不能像现在一样使用它来预测是否可以阅读第1、2和3列。因此,C++中的一个常见模式是:

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

所有
运算符>>(istream&is,T&)
返回inputstream,在布尔上下文中使用时,只要最后一次提取成功,该流即为“true”。使用提取的对象是安全的。

EOF不是一种预测,而是一种错误状态。因此,不能像现在一样使用它来预测是否可以阅读第1、2和3列。因此,C++中的一个常见模式是:

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

所有
运算符>>(istream&is,T&)
返回inputstream,在布尔上下文中使用时,只要最后一次提取成功,该流即为“true”。使用提取的对象是安全的。

我如何检查读取是否失败?只需检查读入的值是否为接受值?如果是这样的话,我认为这是可行的,因为当它无法读入新数据时,它只会将旧数据留在变量中。是否有其他检查方法?将设置EOF。但正如其他人所说:逐行分析行外的值可能更容易,而不是连续执行3次readsHow,我是否可以检查读取是否失败?只需检查读入的值是否为接受值?如果是这样的话,我认为这是可行的,因为当它无法读入新数据时,它只会将旧数据留在变量中。是否有其他检查方法?将设置EOF。但正如其他人所说:逐行分析行外的值可能更容易,而不是进行3次连续读取