C++中的IO流

很久都没有写博客了,也不知道到底是忙还是懒或者怎么的,总之,新的一篇正式开始!

很多人在刚接触C++的时候对其中的输入输出流操作非常感兴趣,同样的,很多人在学习输入输出流的过程中也会遇到很多的问题和麻烦。

要清楚的了解流的原理和流的使用,首先要知道:什么是流?

在计算机编程中,流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供。计算机中的流其实是一种信息的转换。它是一种有序流,因此相对于某一对象,通常我们把对象接收外界的信息输入(Input)称为输入流,相应地从对象向外输出(Output)信息为输出流,合称为输入/输出流(I/O Streams)。对象间进行信息或者数据的交换时总是先将对象或数据转换为某种形式的流,再通过流的传输,到达目的对象后再将流转换为对象数据。所以,可以把流看作是一种数据的载体,通过它可以实现数据交换和传输。[摘自百度百科]

我们可以把流形象的理解成一条运输数据的管道,如下图所示:


     

内置在C++语言的流可以分为控制台流,文件流以及字符串流,支持对控制台窗口和文件等设备的读写。

熟悉了什么是流之后,接下来将介绍:IO函数以及流的常用操作

这里主要介绍 "文件流" 的使用

1. 要使用文件流,首先要包含 "fstream" 头文件,该头文件定义了三种支持文件IO的类型:

  1) ifstream,由istream派生而来,提供读文件的功能

  2) ofstream,由ostream派生而来,提供写文件的功能

  3) fstream,由iostream派生而来,提供读写同一文件的功能

需要读写文件时,须定义自己的对象,并将它们绑定在需要的文件上。

//创建ifstream对象并将其绑定到相应的文件上
string file_name;
//也可以用 ifstream infile("ioTest.txt")
ifstream infile;
infile.open(file_name.c_str());

另外打开文件后,通常要检验文件打开是否成功

//检验打开是否成功
if (!infile)
{
	cerr<<"错误...无法打开文件: "<<file_name<<endl;
	return -1;
}

已经知道上述这些类都由相应的iostream类型派生而来,这个事实意味着可使用IO操作符"<<"和">>"在文件上实现格式化的IO。

2. 常见的输入流成员函数,包括

  1) open()

  2) get()

  3) getline()

  4) read() 

  5) seekg()和tellg()

  6) close()

以ioTest.txt 文件为例,该文件部分内容为:


get 函数:从指定的输入流中读取一个字符,非格式化get 函数的功能与">>"操作符很相像,主要的不同点是get 函数在读人数据时包括空白字符,而">>"操作符在缺省情况下拒绝接受空白字符。

//测试get()函数
char c;
c = infile.get();
cout<<"c: "<<c<<endl;

getline 函数:允许从输入流中读取多个字符,并且允许指定输入终止字符(缺省值是换行字符),通常读取一行字符信息,在读取完成后,从读取的内容中删除该终止字符。

//测试getline()函数
string s;
getline(infile, s);
cout<<"s: "<<s<<endl;

read 函数:从一个文件读字节到一个指定的存储器区域,由长度参数确定要读的字节数。如果给出长度参数,当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时读结束。

seekg和tellg 函数:在输入文件流中,保留着一个指向文件中下一个将读数据的位置的内部指针,可以用 seekg 函数来设置这个指针。使用seekg可以实现面向记录的数据管理系统,用固定长度的记录尺寸乘以记录号便得到相对于文件末尾的字节位置,然后读这个记录。tellg 函数返回当前文件读指针的位置,这个值是streampos类型,该结构定义在iostream中。

//测试seekg和tellp函数
string s;
infile.seekg(3);
getline(infile, s);
cout<<"s: "<<s<<endl;
streampos sp = infile.tellg();
cout<<"sp: "<<sp<<endl;

close函数:fstream对象一旦打开,就保持与指定的文件相关联。如果要把fstream对象与另一个不同的文件关联,则必须先关闭(close)现在的文件,然后打开(open)另一个文件。

infile.open("in");
infile.close();
infile.open("next");

3. 常见的输出流成员函数,包括

  1) open()     2) put()     3) write()     4) seekp和tellp     5) close()

具体的用法与输入流函数相对应。

4. 文件模式

在打开文件时,无论是调用了open还是以文件名作为流初始化的一部分,都需要指定文件模式。


//以默认方式打开file1文件
ofstream outfile1("file1");
//显式打开file2文件
ofstream outfile2("file2", ofstream::out | ofstream::trunc);
//append模式打开file文件
ofstream appfile("file", ofstream::app);

5. 条件状态

IO标准库管理一系列的条件状态成员,用来标记给定的IO对象是否处于可用状态,或者碰到了哪种特定的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值