写在最前面

我这篇博文是根据别人的博文整理而成的,所以出现和别人一样的地方是我摘抄的,我会注明。

在过去,我们使用的是原始的<stdio.h>中的接口,但是今天我想讲的是一个新的库<sstream>,这个库拥有拥有类型安全和不会溢出这样抢眼的特性,很有理由让我们使用它。下面我将详述。

这份笔记我分成了三章,分别讲下面的三个部分。

基础介绍

c++的输入输出分为三种:

1.基于控制台的I/O

r_1.jpg

2.基于文件的I/O

r_2.jpg

3.基于字符串的I/O

r_3.jpg

第二种 基于文件的I/O

fstream: ifstream 和 ofstream

和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操 作,他们分别是ifstream、ofstream、fstream,其中fstream类是由iostream类派生而来,他们之间的继承关系见下图所示。

05cppios04.gif

由于文件设备并不像显示器屏幕与键盘那样是标准默认设备,所以它在fstream.h头文件中是没有像cout那样预先定义的全局对象,所以我们必须自己定义一个该类的对象,我们要以文件作为设备向文件输出信息(也就是向文件写数据),那么就应该使用ofstream类。

ofstream类的默认构造函数原形为
    ofstream::ofstream(constchar *filename,int mode = ios::out,int penprot = filebuf::openprot);

* filename:  要打开的文件名
* mode:    要打开文件的方式
* prot:    打开文件的属性 

其中mode和openprot这两个参数的可选项表见下表:

mode属性表
ios::app 以追加的方式打开文件
ios::ate 文件打开后定位到文件尾,ios:app就包含有此属性
ios::binary 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
ios::in 文件以输入方式打开
ios::out 文件以输出方式打开
ios::trunc 如果文件存在,把文件长度设为0

可以用“或”把以上属性连接起来,如ios::out|ios::binary。

openprot属性表
属性 含义
0 普通文件,打开访问
1 只读文件
2 隐含文件
4 系统文件

可以用“或”或者“+”把以上属性连接起来 ,如3或1|2就是以只读和隐含属性打开文件。

实例代码如下:

#include <fstream> 
usingnamespace std; 

int main()  
{ 
        ofstream myfile("c:\\1.txt",ios::out|ios::trunc,0); 
        myfile<<"white"<<endl<<"中文:"<<"白色"<<endl;
        myfile.close() 
        system("pause"); 
}

文件使用完后可以使用close成员函数关闭文件。

ios::app为追加模式,在使用追加模式的时候同时进行文件状态的判断是一个比较好的习惯。

示例如下:

#include <iostream> 
#include <fstream> 
usingnamespace std; 
int main()  
{ 
        ofstream myfile("c:\\1.txt",ios::app,0); 
        if(!myfile)//或者写成myfile.fail() 
        { 
                cout<<"文件打开失败,目标文件状态可能为只读!"; 
                system("pause"); 
                exit(1); 
        } 
        myfile<<"white"<<endl<<"中文:"<<"白色"<<endl; 
        myfile.close(); 
}

  在定义ifstream和ofstream类对象的时候,我们也可以不指定文件。以后可以通过成员函数open()显式的把一个文件连接到一个类对象上。

  例如:

#include <iostream> 
#include <fstream> 
usingnamespace std; 
int main()  
{ 
        ofstream myfile; 
        myfile.open("c:\\1.txt",ios::out|ios::app,0); 
        if(!myfile)//或者写成myfile.fail() 
        { 
                cout<<"文件创建失败,磁盘不可写或者文件为只读!"; 
                system("pause"); 
                exit(1); 
        } 
        myfile<<"white"<<endl<<"中文:"<<"白色"<<endl; 
        myfile.close(); 
}

下面我们来看一下是如何利用ifstream类对象,将文件中的数据读取出来,然后再输出到标准设备中的例子。

代码如下:

#include <iostream> 
#include <fstream> 
#include <string> 
usingnamespace std; 
int main()  
{ 
        ifstream myfile; 
        myfile.open("c:\\1.txt",ios::in,0); 
        if(!myfile) 
        { 
                cout<<"文件读错误"; 
                system("pause"); 
                exit(1); 
        } 
        char ch; 
        string content; 
        while(myfile.get(ch)) 
        { 
                content+=ch; 
                cout.put(ch);//cout<<ch;这么写也是可以的 
        } 
        myfile.close(); 
        cout<<content; 
        system("pause"); 
}

上例中,我们利用成员函数get(),逐一的读取文件中的有效字符,再利用put()成员函数,将文件中的数据通过循环逐一输出到标准设备(屏幕) 上, get()成员函数会在文件读到默尾的时候返回假值,所以我们可以利用它的这个特性作为while循环的终止条件,我们同时也在上例中引入了C++风格的 字符串类型string,在循环读取的时候逐一保存到content中,要使用string类型,必须包含string.h的头文件。

我们在简单介绍过ofstream类和ifstream类后,我们再来看一下fstream类,fstream类是由iostream派生而来,fstream类对象可以同对文件进行读写操作。

示例代码如下:

#include <iostream> 
#include <fstream> 
usingnamespace std; 
int main()  
{ 
        fstream myfile; 
        myfile.open("c:\\1.txt",ios::out|ios::app,0); 
        if(!myfile) 
        { 
                cout<<"文件写错误,文件属性可能为只读!"<<endl; 
                system("pause"); 
                exit(1); 
        } 
        myfile<<"white"<<endl<<"中文:"<<"白色"<<endl;   
        myfile.close(); 
        
        myfile.open("c:\\1.txt",ios::in,0); 
        if(!myfile) 
        { 
                cout<<"文件读错误,文件可能丢失!"<<endl; 
                system("pause"); 
                exit(1); 
        } 
        char ch; 
        while(myfile.get(ch)) 
        { 
                cout.put(ch); 
        } 
        myfile.close(); 
        system("pause"); 
}

由于fstream类可以对文件同时进行读写操作,所以对它的对象进行初始话的时候一定要显式的指定mode和openprot参数。

可能不够完全,未来还有什么内容再继续补充。


jasperyang
203 声望58 粉丝

Highest purpose is Hacking...