MFC的文件操作

 

指向常量的指针
char ch[5]="list";
const char * pStr=ch;
*pStr='w';//error,修改了指针指向的值
pStr="wangwu";//ok,修改了指针值,而不是指针指向的值

指针常量
char ch[5]="list";
char *const pStr=ch;
表示指针本身是常量,指向的内容可以修改,但是指针值不能修改


通俗一点说,如果指针常量(char *const )初始化的时候指向的是A,那么该指针常量就一直指向A,如果指向常量的指针指向了A(const char *),那么就不能够通过该指针修改A的值

C语言对文件的操作时通过FILE的结构体实现的,首先需要定义一个FILE 结构体的指针,这时就需要考虑怎么得到一个FILE指针,我们可以用fopen()函数,该函数返回一个FILE指针
打开以后就可以写入了,用函数fwrite
当执行完fwrite后并不立即写入文件,因为C中对文件写入实行了缓冲的策略,即内存中要为对磁盘的操作建立缓冲区,而当缓冲区写满以后才对磁盘进行操作,比如,我们要对磁盘写入“kunsa”,而缓冲区比sizeof("kunsa")大得多,那么我们就不能立即得到结果
如果想要立即看到结果,1.可以调用fclose函数来通知系统关闭对该文件的操作,同时,缓冲区的数据就可以写入文件了。但是这种方法有些缺点,当我们需要多次对文件进行操作的时候就不方便了,需要频繁地打开和关闭文件。2.fflush就没有第一种方法的缺点了,该函数的作用是刷新缓冲区,让缓冲区的数据写入到文件中。
应用:写入日志信息的时候需要随时对缓冲区进行刷新,因为如果该日志信息非常重要,那么万一写入一条以后机器死机或者掉电了,那么在缓冲区里边的数据就没有办法存入磁盘了,这时就会造成数据的丢失。

我们可以试着在一个fwrite后再写一个fwrite,对同一个文件进行操作,这时就会发现第一次写入的东西并没有被刷掉,这是因为在C语言对文件的操作中有一个文件指针,当调用一次fwrite后,文件指针就移到了写入的这些信息的后边,这时如果再次调用fwrite就从这些信息开始写了,因此不会被刷掉。
当然,我们可以在第一次写入后将文件指针移动到开头,这样当我们再次写入的时候就可以将数据刷掉了,这时我们可以用fseek()函数来移动文件指针

写操作结束后我们介绍读操作,读操作第一步也是要打开一个文件,这时我们可以用fopen的"r"参数(打开一个文件用于读取,如果找不到该文件,则报错)。

打开文件后可以进行读取,fread()函数用于文件的读取,为了读取文本的时候不会一直读取下去,可以在当初往文本中写数据的时候多写入一个空字符,多写入一个空字符的方法有很多,可以在fwrite函数执行时将写入数据的大小设置为strlen()+1,但是这样会多写入一个字符,这样对文件的准确度会有影响。第二种方法是在读取文件内容以前将ch(暂时存放读取信息的char类型的数组)全部设为0,这样在读取结束后紧下一个字符就为空字符,这时可用memset函数来执行。
这是特殊情况,在这个特殊情况中我们知道文件有多大,我们可以设置足够大的char数组来存入,但是当我们不知道文件有多大的时候就需要用下一种方法了
ftell()函数,可以得到文件指针当前的位置,我们可以借助fseek()将文件指针移动到文件的结尾处,然后用ftell()获取当前指针的位置,即文件的大小。
获取完大小以后就可以进行读取了,但是一定要注意读取文件以前一定要将文件指针放到文件开头,这是读取文件是特别容易犯的一个毛病,否则将从文件结尾处读取,此时读到的信息时没用的。
除了用fseek()将文件指针移动到开始以外,还有另一个更加方便的函数,rewind(),rewind的汉语意思是倒回,rewind函数可以将文件指针移动到文件的开始(beginning of a file)。
一定要注意文件指针的问题,同时,通常我们在读取文本文件的时候会将buffer多分配一个字节,用于存放空字符。

文本方式和二进制方式存储的不同
其实不论是文本方式还是二进制方式,最终在外存中存储的都是二进制代码。
当以文本方式存储时一旦遇到换行字符(ASCII为10),则会转换为回车-换行(ASCII为13,10)。在读取文本文件是,一旦遇到回车-换行的组合,则会转换为换行字符。
当我们按照二进制方式往文件中写入数据时,则将数据在内存中的存储形式原样输出到文件中。
因此我们一定要注意,如果是以文本方式写入的数据,就一定要以文本方式读取数据,如果是以二进制方式写入的数据,就一定要以二进制方式读取数据。
注意文本方式和二进制方式与文本文件和二进制文件的概念是不同的

数字的ASCII码为该数字+48

C++中的文件操作
头文件是 fstream.h
ofstream提供了文件的写入操作,write可以写入,注意写入后要关闭。
例:
ofstream os("a.txt");
os.write("aaaa",strlen("aaaa"));
os.close();
//作用,在a.txt中写入了aaaa字符
ifstream提供了文件的读取操作,read可以读取,注意读取后要关闭。
例:
ifstream is("a.txt");
char ch[100];
memset(ch,0,100);
is.read(ch,100);
is.close();
//作用,将a.txt中的文件读取到ch中

下边是win32 API中对文件操作的一些函数
用CreateFile可以打开很多类型的object(对象?不知道该怎么翻译,呵呵),返回一个操作该对象的句柄
向文件中写入数据可用WriteFile()函数
读取文件中数据可用ReadFile()函数
注:写入文件和读取文件都要通过CreateFile来获取文件句柄,好像CreateFile不是创建文件的意思,而是创建文件句柄的意思。

MFC中对文件的操作
CFile类是MFC的基类,它直接提供了没有缓存的,二进制的输入输出服务,并且它间接地支持文本文件和内存文件
http://blog.sina.com.cn/s/blog_464689a10100hag3.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值