您的位置:首页 > 编程语言 > C语言/C++

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

2013-10-30 22:55 309 查看
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. 因此在使用这两个函数时还是使用最原始的字符数组作为中转;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VC++集成环境