定义于头文件
template< class CharT, class Traits = std::char_traits
类 std::basic_ios 提供设施,以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios 对象能指涉一个实际的 std::basic_streambuf 对象。
继承图
还提供了两个对常见的字符类型的特化:
类型定义iosbasic_ios
状态函数
检查是否没有发生错误,例如是否可执行I/O操作
std::basic_ios
bool good() const;
若流上的最近 I/O 操作成功完成则返回 true 。特别是返回 rdstate() == 0 的结果。
设置流状态位的条件列表,见 ios_base::iostate 。
参数
(无)
返回值
若流未出现错误则为 true ,否则为 false 。
检查是否到达了文件末尾
std::basic_ios
bool eof() const;
若关联流已抵达文件尾则返回 true 。尤其是若 rdstate() 中设置了 eofbit 则返回 true 。
设置 eofbit 的条件列表见 ios_base::iostate 。
参数
(无)
返回值
若遇到文件尾条件则为 true ,否则为 false 。
注意
此函数只报告最近的 I/O 操作所设置的流状态;它不检测关联的数据源。例如,若最近的 I/O 为返回文件最后字节的 get() ,则 eof() 返回 false 。下个 get() 无法读取任何内容,并设置 eofbit 。之后 eof() 才返回 true 。
典型使用中,输入流处理在任何错误上停止。然后能用 eof() 和 fail() 区别不同的错误条件。
检查是否发生了可恢复的错误
std::basic_ios
bool fail() const;
若关联流上已发生错误则返回 true 。特别是若 rdstate() 中设置了 badbit 或 failbit 则返回 true 。
设置 failbit 或 badbit 的条件列表见 ios_base::iostate 。
参数
(无)
返回值=
若已出现错误则为 true ,否则为 false 。
检查是否已发生不可恢复的错误
std::basic_ios
bool bad() const;
若关联的流上已出现不可恢复的错误则返回 true 。尤其是若 rdstate() 中设置了 badbit 则返回 true 。
设置 badbit 的条件列表见 ios_base::iostate 。
参数
(无)
返回值
若出现不可恢复的错误则为 true ,否则为 false 。
检查是否有错误发生(fail() 的同义词)
std::basic_ios
bool operator!() const;
若关联流上已出现错误则返回 true 。特别是若 rdstate() 中设置了 failbit 或 badbit 则返回 true 。
参数
(无)
返回值
若已出现错误则为 true ,否则为 false 。
调用示例
#include
#include
#include
int main()
{
std::ifstream file("test.txt");
if (!file) // operator! 用于此
{
std::cout << "File opening failed\n";
return EXIT_FAILURE;
}
// 典型的 C++ I/O 循环以 I/O 函数的返回值为循环控制条件,
// operator bool() 用于此
for (int n; file >> n;)
{
std::cout << n << ' ';
}
std::cout << '\n';
if (file.bad())
{
std::cout << "I/O error while reading\n";
}
else if (file.eof())
{
std::cout << "End of file reached successfully\n";
}
else if (file.fail())
{
std::cout << "Non-integer data encountered\n";
}
}
检查是否没有发生错误(!fail()的同义词)
std::basic_ios
operator void*() const; (1)(C++11 前) explicit operator bool() const; (2)(C++11 起)
检查流是否无错误。
1) 若 fail() 返回 true 则返回空指针,否则返回非空指针。此指针可隐式转换为 bool ,并可用于布尔语境。
2) 若流无错误且已为 I/O 操作就绪则返回 true 。尤其是返回 !fail() 。
此运算符使得以流和返回到流引用的函数为循环条件可行,产生惯用的 C++ 输入循环,例如 while(stream >> value) {...} 或 while(getline(stream, string)){...} 。这种循环仅若输入操作成功才执行循环体。
参数
(无)
返回值
若流无错误则为 true ,否则为 false 。
调用示例
#include
#include
int main()
{
std::istringstream s("1 2 3 error");
int n;
std::cout << std::boolalpha << "s is " << static_cast
while (s >> n)
{
std::cout << n << '\n';
}
std::cout << "s is " << static_cast
}
返回状态标志
std::basic_ios
iostate rdstate() const;
返回当前错误状态。
参数
(无)
返回值
当前错误状态。它是位掩码类型,并且能是下列常量的组合:
常量解释goodbit无错误badbit不可恢复的流错误failbit输入/输出操作失败(格式化或提取错误)eofbit关联的输出序列已抵达文件尾
调用示例
#include
#include
int main()
{
std::ostringstream stream;
if (stream.rdstate() == std::ios_base::goodbit)
{
std::cout << "stream state is goodbit\n";
}
stream.setstate(std::ios_base::eofbit);
// 检查状态为准确的 eofbit (无 failbit 且无 badbit )
if (stream.rdstate() == std::ios_base::eofbit)
{
std::cout << "stream state is eofbit\n";
}
}
设置状态标志
std::basic_ios
void setstate( iostate state );
在当前已设置表之外,设置流错误状态标志 state 。实质上调用 clear(rdstate() | state) 。可能抛出异常。
参数
state-要设置的流错误状态标志。能为下列常量的组合:
常量解释goodbit无错误badbit不可恢复的流错误failbit输入/输出操作失败(格式化或提取错误)eofbit关联的输出序列已抵达文件尾
返回值
(无)
调用示例
#include
#include
int main()
{
std::ostringstream stream;
if (!stream.fail())
{
std::cout << "stream is not fail\n";
}
stream.setstate(std::ios_base::failbit);
if (stream.fail())
{
std::cout << "now stream is fail\n";
}
if (!stream.good())
{
std::cout << "and stream is not good\n";
}
}
修改状态标志
std::basic_ios
void clear( std::ios_base::iostate state = std::ios_base::goodbit );
通过以 state 的值赋值,设置流错误状态标志。默认赋值 std::ios_base::goodbit ,它拥有的效果为清除所有错误状态标志。
若 rdbuf() 为空指针(即无关联的流缓冲),则赋值 state | badbit 。可能抛出异常。
参数
state-新的错误状态标志设置。它能为下列常量的组合:
常量解释goodbit无错误badbit不可恢复的流错误failbit输入/输出操作失败(格式化或提取错误)eofbit关联的输出序列已抵达文件尾
返回值
(无)
调用示例
#include
#include
int main()
{
double n;
while (std::cout << "Please, enter a number\n"
&& !(std::cin >> n))
{
std::cin.clear();
std::string line;
std::getline(std::cin, line);
std::cout << "I am sorry, but '" << line << "' is not a number\n";
}
std::cout << "Thank you for entering the number " << n << '\n';
}
参考文章
发表评论