STL文件读写基础

STL文件读写基础

stl中对文件读写的函数在头文件fstream中定义,它的基本对象模型如下:

其中包含三个对象ifstrea、ofstream和fstream,分别对文件提供只读、只写、读写功能,从其对象继承关系也可以看出这一点。下面就简单的介绍下基本的文件方法

打开文件

打开文件一般有两种方式:

1、在构造函数中打开

    ifstream input("r:\\3.txt",ios::in | ios::binary);

2、通过open函数打开

    ofstream output;
    output.open("r:\\3.txt",ios::out | ios::binary);

不管用哪种方式,都需要传入两个参数:第一个参数是文件名,第二个参数是打开选项,常见的选项有:in、out、app(append)、binary等。第二个参数也可以不传,此时,对于ifstream,就是以读方式打开、ofstream以写方式打开。

检查是否打开成功

可以通过good函数检查文件是否打开成功:

    if (!input.good())
    {
        cout << "file open fail" << endl;
        return 1;
    }

这个good函数也可以去掉,直接检查steam是否为真(这样可读性不好,不建议,但许多历史代码喜欢这么写,还是应该学习一下)。

    if (!input)
    {
        cout << "file open fail" << endl;
        return 1;
    }

定位和获取当前位置

有的时候,我们需要对文件进行随机访问,如连接两个文件的时候就要定位到文件的末尾。在stl中可以通过stream对象的seekg实现这一功能。与之相对的就是获取当前位置,函数为tellg,如下代码演示了利用这两个函数获取文件长度。

    input.seekg (0,ios::end);
    int length = input.tellg();

tellg函数比较简单,没有参数,直接返回当前位置。而seekg有两个参数:第一个参数是偏移量,可以为负数;第二个参数则是相对位置,可以选取ios::begbeginios::endendios::curcurrent三个值,这个参数可以省略,省略的时候是取的ios::beg从文件头定位。

关闭文件

关闭文件有两个方法:

  1. 调用close方法显式关闭
  2. 对象删除的时候隐式关闭

具体使用哪个这个看个人喜好了,就我个人而言,我一般喜欢在构造函数中打开文件,不习惯调用open函数,因此也比较倾向于隐式关闭,不调用close函数。

读写文件

下面我们就以一个文件拷贝为例简单的介绍下读写的方式:

1、传统的缓冲区读写

    char buf[1024];
    while(!input.
eof())
    {
        int count = sizeof(buf);
        input.
read(buf, count);
        output.
write(buf, count);
    }

std::string strSrcFile = "aaa";
std::string strDstFile = "bbb";
std::streamsize ssCount = 0;
char szBuf[8192];
std::ifstream copySrc;
std::ofstream copyDst;

copySrc.open(strSrcFile.c_str(), std::ios::in | std::ios::binary);
copyDst.open(strDstFile.c_str(), std::ios::out | std::ios::binary);
while(!copySrc.eof())
{
	ssCount = sizeof(szBuf);
	memset(szBuf, 0, sizeof(szBuf));
	//copySrc.read(szBuf, ssCount);
	//ssCount = copySrc.gcount();
	ssCount = copySrc.read(szBuf, ssCount).gcount();
	copyDst.write(szBuf, ssCount);
}
copySrc.close();
copyDst.close();

这里主要用到了三个函数:read函数为读,write函数写,eof检查是否读取到了文件结尾。

2、利用string逐行读写

    string line;
    while(std::
getline(input, line))
        output
<< line << endl ;

这里用了getline行数从流里每次读写一行,用 << 运算符将内容写入流,不过这种方式仅仅适合读写文本文件。

3、流方式读写

    output<< input.rdbuf();

这个方式非常简单,只用了一行代码就可以实现:用rdbuf函数获取读缓冲区,用 << 运算符在两个流对象之间建立管道。


参数ios_base::openmode用以指定文件的打开方式,可以是如表6-4所示的标志的组合。


6-4  ios_base::openmode标志

标志

含义

ios::app

追加模式(append),新输出的内容追加在原文件内容的后面

ios::ate

文件打开后定位到文件尾,ios:app就包含此属性

ios::binary

以二进制方式打开文件,默认的方式是文本方式

ios::in

文件以输入方式打开

ios::out

文件以输出方式打开

ios::trunc

截断模式(truncate),如果文件存在,则把文件长度设为0

ios::nocreate

如果文件不存在则不创建

ios::noreplace

如果文件已存在则不替换

相关博客:

http://blog.csdn.net/kingstar158/article/details/6859379

http://book.51cto.com/art/200908/145781.htm



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值