c++ io标准库2(二)

2014-11-24 12:41:14 · 作者: · 浏览: 1
)或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。

对于stringstream了来说,不用我多说,大家也已经知道它是用于C++风格的字符串的输入输出的。
  stringstream的构造函数原形如下:

  stringstream::stringstream(string str);

  示例代码如下:

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <sstream>
#include <string>
usingnamespace std;

intmain()
{
stringstream ostr("ccc");
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<
char a;
ostr>>a;
cout<
system("pause");
}

  除此而外,stringstream类的对象我们还常用它进行string与各种内置类型数据之间的转换。

  示例代码如下:

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <sstream>
#include <string>
usingnamespace std;

intmain()
{
stringstream sstr;
//--------int转string-----------
int a=100;
string str;
sstr< sstr>>str;
cout< //--------string转char[]--------
sstr.clear();//如果你想通过使用同一stringstream对象实现多种类型的转换,请注意在每一次转换之后都必须调用clear()成员函数。
string name = "colinguan";
char cname[200];
sstr< sstr>>cname;
cout< system("pause");
}

  接下来我们来学习一下输入/输出的状态标志的相关知识,C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。

goodbit 无错误

Eofbit 已到达文件尾

failbit 非致命的输入/输出错误,可挽回

badbit 致命的输入/输出错误,无法挽回
有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit.

  下例示例,表示出了rdstate()的用法:

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
usingnamespace std;

intmain()
{
int a;
cin>>a;
cout<<cin.rdstate()< if(cin.rdstate() == ios::goodbit)
{
cout<<"输入数据的类型正确,无错误!"< }
if(cin.rdstate() == ios_base::failbit)
{
cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"< }
system("pause");
}

  另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态:

bool bad();

bool eof();

bool fail();

bool good();

  下例示例,表示出了上面各成员函数的用法:

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
usingnamespace std;

intmain()
{
int a;
cin>>a;
cout<<cin.rdstate()< if(cin.good())
{
cout<<"输入数据的类型正确,无错误!"< }
if(cin.fail())
{
cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"< }
system("pause");
}

  如果错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。

  示例代码如下:

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
usingnamespace std;

intmain()
{
int a;
cin>>a;
cout<<cin.rdstate()< cin.clear(ios::goodbit);
cout<<cin.rdstate()< system("pause");
}

通常当我们发现输入有错又需要改正的时候,使用clear()更改标记为正确后,同时也需要使用get()成员函数清除输入缓冲区,以达到重复输入的目的。

  示例代码如下:

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
usingnamespace std;

intmain()
{
int a;
while(1)
{
cin>>a;
if(!cin)//条件可改写为cin.fail()
{
cout<<"输入有错!请重新输入"< cin.clear();
cin.get();
}
else
{
cout< break;
}
}
system("pause");
}

  最后再给出一个对文件流错误标记处理的例子,巩固学习,代码如下:

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者
#include <iostream>
#include <fstream>
usingnamespace std;

intmain()
{
ifstream myfile("c:\\1.txt",ios_base::in,0);
if(myfile.fail())
{
cout<<"文件读取失败或指定文件不存在!"< }
else
{
char ch;
while(myfile.get(ch))
{
cout< }
if(myfile.eof())
{
cout<<"文件内容已经全部读完"< }
while(myfile.get(ch))
{
cout< }
}
system("pause");
}

C语言提供了格式化输入输出的方法,C++也同样,但是C++的控制符使用起来更为简单方便,在c++下有两中方法控制格式化输入输出。
  1.有流对象的成员函数。
  例如,下列程序以成员函数的方式控制输出的精度:

//程序作者:管宁
//站点:www.cndev-lab.com
//所有稿件均有版权,如要转载,请务必著名出处和作者

#include <iostream>
usingnamespace std;

intmain()
{
float pi=3.14159f;
cout< cout.precision(2);
cout< system("pause");
}

  2.使用C++输入输出控制符,控制符是在拖文件iomanip