c++中流的状态检查(eof等使用注意事项)

状态检查 

用于检测c++流的相关状态 

s.is_open() 检测流s是否打开成功
s.eof() 流s是否结束
s.fail()

流s的failbit或者badbit被置位时, 返回true

failbit: 出现非致命错误,可挽回, 一般是软件错误

badbit置位, 出现致命错误, 一般是硬件错误或系统底层错误, 不可挽回

s.bad()

流s的badbit置位时, 返回true。检测致命错误

good()

流s处于有效状态时, 返回true

clear()

流s的所有状态都被复位 (变成good的状态)

上面的函数都是通过设置相应的状态位来实现的,如果出现上面相应的问题,会将相应的状态位设置成相应的值(不是1就是0)。

 

 注意:直接看可能不太懂,当遇到问题时再来看就会明白

下面的两种情况可能出现在所有的状态检测函数中。 

1.   eof()用于检测流是否结束,对于文件,文件结束是EOF,这时候我们需要注意,我们将文件的数据读取完之后,eof()对应的状态位并不会设置,也就是说这时候虽然读取到了文件的结尾,但是eof()并不会检测出已经到文件结尾了(返回false),因为相应的状态位还没有被设置。 

这时候,我们再去读取文件,会读取到EOF这个文件结束标志,这时候才会设置eof()对应的标志位。才会返回true。

所以,我们在读取文件的时候,使用s.eof()来判断是否读到文件结尾时,往往会多读一次,因为即使读完了文件的所有数据,没有读到EOF,eof()还是会返回false。如果在程序中先判断是否结束,后读取,再操作文件中读取的数据,由于文件数据已经读完之后,又多读一次,这样可能会导致读取的数据是空的,会导致我们在后面操作数据的时候出现问题。

这时候,我们应该先读取,后判断,再进行相应的操作, 这样在我们操作文件中读取的数据之前, 就已经进行了判断是否到达了尾部,(如果到了就直接结束了),不会处理读取的空数据。 

 

2.  上面说到,这些函数都是通过设置标志位来实现的,但是当标志位设置之后,程序执行过程中这个标志位会一直被设置,可能会影响后面的操作,这时候就需要使用s.clear()将标志位设置为原来的状态。

举个例子:  if(io.eof()){...};  当文件到达文件结尾时,标志位被设置。那么eof()返回true。就会执行if里面的语句。

如果,程序后面还需要使用相同的语句   if(!io.eof()){...};  当文件没有到达文件结尾的时候执行if语句中的代码。但是,eof()返回真假是根据标志位是否被设置返回的,因为我们上面已经将标志位设置了,此时调用eof()标志位依然被设置,返回值就是固定的,但是,在后面的需求中,这并不满足我们的需求。

对于上面的情况,可以在下面再使用eof()的时候,使用clear()将前面代码设置的标志位都回归到原来的状态。这样就不会影响后面的代码了。

总结来说: 

1. 就是标志位一旦设置,在程序执行的时候就不会改变,当我们在程序后面使用的时候,可能会影响后面代码的执行,所以后面我们可以使用clear(),将前面设置的标志位清除掉。 

你可能感兴趣的:(c++,开发语言)