注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

又一个部落格

换过很多备忘录,不知道这本怎么样!

 
 
 

日志

 
 

c++ i/o  

2010-03-03 16:16:41|  分类: c++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
老的i/0系统<iostream.h>和新的i/o系统<iostream>
主要有两个区别.
1.新的i/o系统增加了少量的功能,和定义了一些新的数据类型,所以在本质上,新的i/o系统是支持老的i/o系统的
2.老的i/o系统属于全局范围,新的i/o系统属于std命名空间

c++的i/o系统都是基于streams
streams有两种,text和binary
text使用characters
binary可以使用任何类型

几个预定义的streams
cin, cout, cerr, and clog.
cerr和clog都是标准输出.
区别在于cerr是立即输出,clog要等到缓冲区满了才输出
这几个streams还有16位版本的,就是双字节的,用来支持比如中文(wide character)
wcin, wcout, wcerr, and wclog.

两个类模板
basic_streambuf   low-level I/O class
basic_ios         high-level I/O class
    几个基本派生类 basic_istream, basic_ostream, and basic_iostream
模板于类名称对应关系
basic_streambuf        streambuf
basic_ios            ios
basic_istream        istream
basic_ostream        ostream
basic_iostream        iostream
basic_fstream        fstream
basic_ifstream        ifstream
basic_ofstream        ofstream
当包含了 <iostream> 以上的类将都可以使用

重载<<符例子
#include <iostream>
using namespace std;

class ThreeD{
public:
    int x,y,z;
    ThreeD(int a,int b, int c){
        x=a;
        y=b;
        z=c;
    }
};

ostream &operator<<(ostream &stream, ThreeD obj){
    stream<<obj.x<<", ";
    stream<<obj.y<<", ";
    stream<<obj.z<<endl;
    return stream;
}

int main() {
    ThreeD a(1,2,3),b(3,4,5),c(5,6,7);
    cout<<a<<b<<c;
    return 0;
}


文件的输入输出
包含头 <fstream>
ifstream in; //input
ofstream out; // output
fstream both; //input and output

open函数的原型
    void ifstream::open(const char*filename, ios::openmode mode=ios::in);
    void ofstream::open(const char*filename, ios::openmode mode=ios::trunc|ios:;out);
    void ifstream::open(const char*filename, ios::openmode mode=ios::out |ios::in);
打开方式一共有下面6种
    ios::app  // append 缩写 意思再尾部增加
    ios::ate  //打开文件后,指针在指针尾部
    ios::binary // 默认文件打开方式是 text形式的,使用这个参数后,文件用二进制方式打开
                //两种方式打开的区别在于,用text形式打开,有些字符会被替换,比如回车换行符==
                //二进制则不会出现这样的情况
    ios::in
    ios::out
    ios::trunc //如果文件已经存在,那么原文件被打开后,长度截取为0
    
写文件例子
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ofstream out("test");
    if(!out){
        cout << "Cannot open file."<<endl;
        return 1;
    }

    out<<10<<" "<<123.23<<endl;
    out<<"This is a short text file.";
    out.close();

    return 0;
}

读取一个文件
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    char ch;
    int i;
    float f;
    char str[80];

    ifstream in("test");
    if(!in){
        cout <<"cannot open file.\n";
        return 1;
    }

    in>>i;
    in>>f;
    in>>ch;
    in>>str;

    cout<<i<<" "<<f<<" "<<ch<<" "<<endl;
    cout<<str;
    in.close();

    return 0;
}

上面要注意的地方是, << 操作符读的是字符串,所以到了空白的地方就会停止,
然后打开方式是用默认的text方式,所以会发生一些替换,比如会忽略空白.


使用get( ) and put( ) 函数
istream &get(char &ch); ostream &put(char ch);

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    char ch;
    ifstream in ("test", ios::in|ios::binary);
    if(!in){
        cout <<"Cannot open file.\n";
        return 1;
    }
    while(in){
        in.get(ch);
        if(in)cout<<ch;
    }
    in.close();
    return 0;
}

用put写文件
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    char *p = "hello there\n";
    ofstream out("test", ios::out|ios::binary);
    if(!out){
        cout<<"Cannot open file.\n";
        return 1;
    }
    while(*p)out.put(*p++);
    out.close();
    return 0;
}

使用read( ) and write( ) 函数
istream &read(char *buf, streamsize num); ostream &write(const char *buf, streamsize num);

还有一些常用的函数
getline( )
eof()
peek( )
putback( )
flush( )


C++ I/O system有两个指针,一个写入指针,一个读取指针
分别用 seekp(写入) 和 seekg(读取)函数设置位置
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

int main(int argc,char *argv[]) {
    if(argc!=3){
        cout<<"Usage:change<filename> <byte>\n";
        return 1;
    }
    fstream out(argv[1], ios::in|ios::out|ios::binary);
    if(!out){
        cout<<"Cannot open file.\n";
        return 1;
    }
    out.seekp(atoi(argv[2]),ios::beg);
    out.put('X');
    out.close();

    return 0;
}

  评论这张
 
阅读(157)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017