C++ iostream标准库

759人阅读 评论(0) 收藏 举报
分类:
  1. iostream分为输入输出流,即istream和ostream,其针对控制窗口的输入输出;常见的输入输出函数有cin cout cerror;
  2. fstream主要是来解决文件操作流,也是iostream的衍生类(包含输入输出),我们知道的有ifstream和ofstream;
  3. sstream主要是来解决c风格的字符串操作流,也是iostream的衍生类(包含输入输出),我们知道的有istrstream和ostrstream;如果想解决c++字符串的流,就要使用stringstream;

以下用存取文件的例子来说明ifstream和ofstream:

void write_file()
{
    ofstream myfile("c:\\1.txt", ios::app, _SH_DENYNO);
    if (myfile.fail())
    {
        cout << "文件打开失败";
        myfile.open("c:\\1.txt", ios::out | ios::trunc, _SH_DENYNO);
    }
    myfile << "中国软件开发实验室" << endl << "网址:" << "www.cndev- lab.com" << endl;
    myfile.close();

}

void read_file()
{
    ifstream myfile("c:\\1.txt", ios::out, _SH_DENYNO);
    char ch;
    string content;
    while (myfile.get(ch))
    {
        content += ch;
    }
    cout << content << endl;
    myfile.close();
}

/**
 * iostream集成输入输出
 */
void read_write(const string &in_path,const string &out_path)
{
    ifstream in_file(in_path, ios::out, _SH_DENYWR);
    char cc;
    string content;
    while (in_file.get(cc))
    {
        content += cc;
    }
    ofstream out_file(out_path, ios::out, _SH_DENYWR);
    out_file << content << endl;
    out_file.close();
    in_file.close();
}

ifstream和ofstream解决了从流到char *的转换,代码如下:

using namespace std;

void read_str()
{ 
    char *name = "www.cndev-lab.com";
    istrstream is(name, strlen(name) + 1);
    char read;
    while (is.get(read))
    {
        cout << read;
    }
    cout << endl;
}

void write_str()
{
    int arraysize = 1;
    char *pbuffer = new char[arraysize];
    ostrstream ostr(pbuffer, arraysize, ios::out);
    ostr << arraysize << ends;//使用ostrstream输出到流对象的时候,要用ends结束字符串 
    cout << pbuffer;
    delete[] pbuffer;
}

/**
 * stringstream解决类型转换
 */
void test_stringstream()
{
    stringstream ost("hello world");
    ost.put('\n');
    ost << "OK";
    cout << ost.str() << endl;

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

对于文件的打开 传输状态 ,c++定义了如下两种方式

第一种,通过状态值判断

  • goodbit 无错误
  • Eofbit 已到达文件尾
  • failbit 非致命的输入/输出错误,可挽回
  • badbit 致命的输入/输出错误,无法挽回
/**
 *  通过状态修改
 */
void stream_state()
{
    int a=0; 
    cin >> a; 
    cout << cin.rdstate() << endl; 
    if (cin.rdstate() == ios::goodbit) 
    { 
        cout << "输入数据的类型正确,无错误!" << endl; 
    } 
    if (cin.rdstate() == ios_base::failbit) 
    { 
        cout << "输入数据类型错误,非致命错误,可清除输入缓冲区挽回!" << endl; 
    }
}

第二种,通过方法判断

bool bad(); bool eof();
bool fail(); bool good();

void stream_state_method()
{
    /*
    int a=0; cin >> a;
    cout << cin.rdstate() << endl;
    cin.clear(ios::goodbit);
    cout << cin.rdstate() << endl;
    */

    int a=0; 
    while (1) {
        cin >> a;
        if (cin.fail()){
            cout<<"输入有错!请重新输入"<<endl;
            cin.clear();
            cin.get();
        }
        else{
            cout<<a; break;
        }
    }
}

参考文件:http://www.cppblog.com/yuqilin1228/archive/2010/03/26/110620.html

1
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:174989次
    • 积分:3335
    • 等级:
    • 排名:第11406名
    • 原创:136篇
    • 转载:11篇
    • 译文:11篇
    • 评论:21条
    我的微信
      IT培训
      分享计算机相关信息技术、生活感悟。
    博客专栏