定义于头文件 <ios>
template< class CharT, |
类 std::basic_ios 提供设施,以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios 对象能指涉一个实际的 std::basic_streambuf 对象。
继承图
还提供了两个对常见的字符类型的特化:
类型 | 定义 |
ios | basic_ios<char> |
wios | basic_ios<wchar_t> |
状态函数
检查是否没有发生错误,例如是否可执行I/O操作
std::basic_ios<CharT,Traits>::good
bool good() const; |
若流上的最近 I/O 操作成功完成则返回 true 。特别是返回 rdstate() == 0 的结果。
设置流状态位的条件列表,见 ios_base::iostate 。
参数
(无)
返回值
若流未出现错误则为 true ,否则为 false 。
检查是否到达了文件末尾
std::basic_ios<CharT,Traits>::eof
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<CharT,Traits>::fail
bool fail() const; |
若关联流上已发生错误则返回 true 。特别是若 rdstate() 中设置了 badbit
或 failbit
则返回 true 。
设置 failbit
或 badbit
的条件列表见 ios_base::iostate 。
参数
(无)
返回值=
若已出现错误则为 true ,否则为 false 。
检查是否已发生不可恢复的错误
std::basic_ios<CharT,Traits>::bad
bool bad() const; |
若关联的流上已出现不可恢复的错误则返回 true 。尤其是若 rdstate() 中设置了 badbit 则返回 true 。
设置 badbit
的条件列表见 ios_base::iostate 。
参数
(无)
返回值
若出现不可恢复的错误则为 true ,否则为 false 。
检查是否有错误发生(fail() 的同义词)
std::basic_ios<CharT,Traits>::operator!
bool operator!() const; |
若关联流上已出现错误则返回 true 。特别是若 rdstate() 中设置了 failbit
或 badbit
则返回 true 。
参数
(无)
返回值
若已出现错误则为 true ,否则为 false 。
调用示例
#include <iostream>
#include <fstream>
#include <cstdlib>
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<CharT,Traits>::operator bool
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 <iostream>
#include <sstream>
int main()
{
std::istringstream s("1 2 3 error");
int n;
std::cout << std::boolalpha << "s is " << static_cast<bool>(s) << '\n';
while (s >> n)
{
std::cout << n << '\n';
}
std::cout << "s is " << static_cast<bool>(s) << '\n';
}
返回状态标志
std::basic_ios<CharT,Traits>::rdstate
iostate rdstate() const; |
返回当前错误状态。
参数
(无)
返回值
当前错误状态。它是位掩码类型,并且能是下列常量的组合:
常量 | 解释 |
goodbit | 无错误 |
badbit | 不可恢复的流错误 |
failbit | 输入/输出操作失败(格式化或提取错误) |
eofbit | 关联的输出序列已抵达文件尾 |
调用示例
#include <iostream>
#include <sstream>
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<CharT,Traits>::setstate
void setstate( iostate state ); |
在当前已设置表之外,设置流错误状态标志 state
。实质上调用 clear(rdstate() | state) 。可能抛出异常。
参数
state | - | 要设置的流错误状态标志。能为下列常量的组合:
|
返回值
(无)
调用示例
#include <iostream>
#include <sstream>
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<CharT,Traits>::clear
void clear( std::ios_base::iostate state = std::ios_base::goodbit ); |
通过以 state
的值赋值,设置流错误状态标志。默认赋值 std::ios_base::goodbit ,它拥有的效果为清除所有错误状态标志。
若 rdbuf() 为空指针(即无关联的流缓冲),则赋值 state | badbit 。可能抛出异常。
参数
state | - | 新的错误状态标志设置。它能为下列常量的组合:
|
返回值
(无)
调用示例
#include <iostream>
#include <string>
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';
}