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. 因此在使用这两个函数时还是使用最原始的字符数组作为中转;