十三、C++操作文件简介

1.   ofstream类和ifstream类:

       a. 前者用于写文件,后者用于读文件;

       b. 打开文件都是利用其构造函数实现;

       c. 其构造函数都一样,第一个参数是文件路径名(const char *),第二个参数表示打开模式,第三个参数表示文件的保护模式;

       d. 几种常用的访问模式:

            i.   都是以ios::作为前缀;

            ii.  out:以写方式打开,如果文件不存在则创建,如果文件存在则截断;

            iii. trunc:即如果文件存在就截断,使用out模式时已经包含了该模式;

            iv. nocreate:如果文件不存在则不创建文件,即打开失败;

            v.  in:以只读方式打开;

            vi. app:追加方式写(不存在的话就创建,但是不会截断);

            v.  binary:以二进制方式打开文件,具体是读还是写要和其它模式进行组合;

            组合时连接符仍然是按位与|;

       e. 保护模式:

            i.   均已filebuf::sh_作为前缀,表示的是一种共享模式,sh即share的缩写;

            ii.  compat:兼容共享;

            iii. none:排他独占;

            iv.  read:读共享;

            v.   write:写共享;

       f.   其中第二个参数的默认值对于ofstream来说是ios::out,对于ifstream俩说是ios::in,第三个参数两者的默认值都是file_buf::sh_compat、


2.   写文件示例(控制台测试程序):

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

int main() {

	char pBuf[100];
	memset(pBuf, 0, 100);
	ofstream out("M:\\Test Programs\\vim\\Test.txt");
	for ( int i = 1 ; i <= 20 ; i++ ) {
	
		sprintf(pBuf, "Line %d\n", i);
		out.write(pBuf, strlen(pBuf));//所有write函数都是大同小异的
		//第一个参数永远都是内存区,不管是写入到内存区还是从内存区提取
		//后面必有一个参数表示要转存的字节数
	}
	out.close();
	
	return 0;
}

3.   读文件示例(控制台测试程序):

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

int main() {

	ifstream in("M:\\Test Programs\\vim\\Test.txt");

	//C++同样没有提供获取文件字节数的函数
	//同样需要通过设置位置指针的方法获取文件字节数
	//这不过这里的函数都成立ifstream类的成员方法而已
	//所有函数名都去掉了f前缀(因为它们都是成员函数)
	//而在名称后面都加了一个g后缀,其表示位置指针的意思
	//参考位置和C语言有所不同
	//都是fstream类中定义的静态成员变量,只属于类而不属于对象
	//都以ios::作为前缀
	//beg表示begin,即文件头
	//cur表示current,即当前位置指针的位置
	//end表示文件尾
	in.seekg(0, ios::end);
	int iFileLen = in.tellg();
	int iBufLen = iFileLen + 1;
	in.seekg(0, ios::beg);

	char *pBuf = new char [iBufLen];
	memset(pBuf, 0, iBufLen);
	in.read(pBuf, iFileLen);
	printf("%s", pBuf);
	in.close();
	delete [] pBuf;
	pBuf = NULL;

	return 0;
}

4.   注意write和read的第一个参数:

       i.   write是const void *类型的,而read是void *类型的;

       ii.  但是对于string类都没有定义过转换到这两种类型的方法,因此如果使用强制类型转换将是非常不安全的,将会丢失信息;

       iii. 因此在使用这两个函数时还是使用最原始的字符数组作为中转;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值