个人 做自媒体 建网站,图片制作成视频的手机软件,中宁网站建设,帝国cms 网站地图标签C的sstream标准库介绍 接下来我们继续看一下C风格的串流控制 #xff0c;C引入了ostringstream、istringstream、stringstream这三个类#xff0c;要使用他们创建对象就必须包含sstream.h头文件。 istringstream类用于执行C风格的串流的输入操作。 ostringstream类用于执行… C的sstream标准库介绍 接下来我们继续看一下C风格的串流控制 C引入了ostringstream、istringstream、stringstream这三个类要使用他们创建对象就必须包含sstream.h头文件。 istringstream类用于执行C风格的串流的输入操作。 ostringstream类用于执行C风格的串流的输出操作。 strstream类同时可以支持C风格的串流的输入输出操作。 istringstream类是从istream输入流类和stringstreambasec字符串流基类派生而来ostringstream是从ostream输出流类和stringstreambasec字符串流基类派生而来stringstream则是从iostream(输入输出流类)和和stringstreambasec字符串流基类派生而来。 他们的继承关系如下图所示: istringstream是由一个string对象构造而来istringstream类从一个string对象读取字符。 istringstream的构造函数原形如下 istringstream::istringstream(string str); 复制代码 代码如下: #include iostream #include sstream using namespace std; int main () { istringstream istr; istr.str(“1 56.7”,); //上述两个过程可以简单写成 istringstream istr(“1 56.7”); cout istr.str()endl; int a; float b; istra; cout aendl; istrb; cout bendl; system(“pause”); } 上例中构造字符串流的时候空格会成为字符串参数的内部分界例子中对a,b对象的输入”赋值”操作证明了这一点字符串的空格成为了整型数据与浮点型数据的分解点利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。 str()成员函数的使用可以让istringstream对象返回一个string字符串例如本例中的输出操作(coutistr.str();。
ostringstream同样是由一个string对象构造而来ostringstream类向一个string插入字符。
ostringstream的构造函数原形如下 ostringstream::ostringstream(string str);
示例代码如下 复制代码 代码如下: #include iostream #include sstream #include string using namespace std; int main () { ostringstream ostr; //ostr.str(“abc”);//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长 ostr.put(‘d’); ostr.put(‘e’); ostr”fg”; string gstr ostr.str(); cout gstr; system(“pause”); } 在上例代码中我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串通过str()函数返回增长过后的完整字符串数据但值得注意的一点是当构造的时候对象内已经存在字符串数据的时候那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。 对于stringstream了来说不用我多说大家也已经知道它是用于C风格的字符串的输入输出的。
stringstream的构造函数原形如下 stringstream::stringstream(string str);
示例代码如下: 复制代码 代码如下: #include iostream #include sstream #include string using namespace std; int main () { stringstream ostr(“ccc”); ostr.put(‘d’); ostr.put(‘e’); ostr”fg”; string gstr ostr.str(); cout gstrendl; char a; ostra; cout a system(“pause”); } 除此而外stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换。 示例代码如下 复制代码 代码如下: #include iostream #include sstream #include string using namespace std; int main () { stringstream sstr; //——–int转string———– int a100; string str; sstra; sstrstr; cout strendl; //——–string转char[]——– sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换请注意在每一次转换之后都必须调用clear()成员函数。 string name “colinguan”; char cname[200]; sstrname; sstrcname; cout cname; system(“pause”); } 接下来我们来学习一下输入/输出的状态标志 的相关知识C中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型就像open_mode一样以下便是它包含的值。 goodbit 无错误 Eofbit 已到达文件尾 failbit 非致命的输入/输出错误可挽回 badbit 致命的输入/输出错误,无法挽回
有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数它将返回当前状态的错误标记。例如假如没有任何错误则rdstate()会返回goodbit.
下例示例表示出了rdstate()的用法 复制代码 代码如下: #include iostream using namespace std; int main () { int a; cin a; cout cin .rdstate()endl; if (cin .rdstate() ios ::goodbit) { cout ”输入数据的类型正确无错误”endl; } if (cin .rdstate() ios_base::failbit) { cout ”输入数据类型错误非致命错误可清除输入缓冲区挽回”endl; } system(“pause”); } 另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态 bool bad(); bool eof(); bool fail(); bool good(); 下例示例表示出了上面各成员函数的用法 复制代码 代码如下: #include iostream using namespace std; int main () { int a; cin a; cout cin .rdstate()endl; if (cin .good()) { cout ”输入数据的类型正确无错误”endl; } if (cin .fail()) { cout ”输入数据类型错误非致命错误可清除输入缓冲区挽回”endl; } system(“pause”); } 如果错误发生那么流状态既被标记为错误你必须清除这些错误状态以使你的程序能正确适当地继续运行。要清除错误状态需使用clear()函数。此函数带一个参数它是你将要设为当前状态的标志值。只要将ios::goodbit作为实参。 示例代码如下 复制代码 代码如下: #include iostream using namespace std; int main () { int a; cin a; cout cin .rdstate()endl; cin .clear(ios ::goodbit); cout cin .rdstate()endl; system(“pause”); } 通常当我们发现输入有错又需要改正的时候使用clear()更改标记为正确后同时也需要使用get()成员函数清除输入缓冲区以达到重复输入的目的。 示例代码如下 复制代码 代码如下: #include iostream using namespace std; int main () { int a; while (1) { cin a; if (!cin )//条件可改写为cin.fail() { cout ”输入有错!请重新输入”endl; cin .clear(); cin .get(); } else { cout a; break ; } } system(“pause”); } 最后再给出一个对文件流错误标记处理的例子巩固学习代码如下 复制代码 代码如下: #include iostream #include fstream using namespace std; int main () { ifstream myfile(“c://1.txt”,ios_base::in,0); if (myfile.fail()) { cout ”文件读取失败或指定文件不存在!”endl; } else { char ch; while (myfile.get(ch)) { cout ch; } if (myfile.eof()) { cout ”文件内容已经全部读完”endl; } while (myfile.get(ch)) { cout ch; } } system(“pause”); }