C++LinuxCMFC文件学习大全.docx
《C++LinuxCMFC文件学习大全.docx》由会员分享,可在线阅读,更多相关《C++LinuxCMFC文件学习大全.docx(34页珍藏版)》请在冰豆网上搜索。
C++LinuxCMFC文件学习大全
文件
说明:
该文件综合了C语言、C++、MFC、Linux等文件的使用方法。
整理:
奇世雅一
1.C语言
文件:
Ø“文件”是指存储在计算机外部存储器中的数据的集合,计算机根据文件的名字,完成对文件的操作。
ØC语言将文件看作是字符构成的序列,即字符流。
其基本的存储单位是字节。
ØC语言中的文件,按照它的ASCII代码存放,称为ASCII文件或文本(test)文件。
按照数据值的二进制代码存放,称为二进制文件。
ØASCII文件中的字节与实际字符一一对应,方便字符处理和用户阅读,但占用空间较大,而二进制文件节省存储空间,也无需ASCII代码和二进制形式之间的转换时间,但无法直接输出,一般用于程序与程序之间或者程序与设备之间数据传递。
Ø缓冲文件系统:
缓冲文件系统是指:
系统自动地在内存中为每一正在使用的文件名开辟一个缓冲区。
从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘中去,如果从磁盘向内存读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区。
输出
输出
输入文件缓冲区
输出文件缓冲区
程序数据区
磁盘
输入
输入
Ø非缓冲文件系统:
非缓冲文件系统是指:
系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。
ÌUNIX系统下,用缓冲文件系统来处理文本文件,用非缓冲文件系统处理二进制文件。
Ì用缓冲文件系统进行输入输出又称为高级(或高层)磁盘输入输出(高层I/O)
Ì用非缓冲文件系统进行输入输出又称低级(底层)输入输出系统。
ÌANSIC标准决定不采用非缓冲文件系统,而只采用缓冲文件系统。
1、文件类型指针:
FILE*fp1,*fp2;
2、文件的打开:
FILE*fp;
fp=fopen(文件名,处理文件的方式);
fopen()函数处理文件方式表:
⌦如果是二进制文件,在使用时只要在模式后添加字符〝b〞即可。
如〝rb〞、〝rb+〞分别表示读取二进制文件和以读取/写入方式打开二进制文件
3.文件的关闭
fclose(文件指针);
头文件:
#include
文件读写:
Ø按字符读写:
fgetc()、fputc()
Ø按字符串读写:
fgets()、fputs()
Ø按格式要求读写:
fprintf()、fscanf()
Ø按数据块读写:
fread()、fwrite();
Ø以上分别在头文件#include
(1)fputc()函数
原型:
intfputc(intc,FILE*stream);
作用:
向文件写入一个字符
调用形式:
fputc(字符,文件型指针变量);
Øfputc将字符常量‘A’写入文件当前位置,并且使文件位置指针下移一个字节,如果写入操作成功,返回值是该字符,否则返回EOF(-1)。
(2)fgetc()函数
原型:
intfgetc(FILE*stream);
作用:
从一个文件读取一个字符
调用形式:
fgetc(文件型指针变量);
Øfgetc()不仅返回文件当前位置的字符,并且使文件位置下移一个字符,如果遇到文件结束,则返回值为文件结束标志EOF(-1)。
Ø为了解决需要读入有用数据却被处理为“文件结束”的情况,ANSIC提供了一个feof()函数来判断文件是否真的结束,feof(fp)用来测试fp所指向的文件当前状态是否“文件结束”,如果真结束返回真
(1),否则为假(0)。
Øfeof原型:
intfeof(FILE*stream);
例:
#include
intmain(void)
{
FILE*stream=NULL;
stream=fopen("test.txt","r");
charch=fgetc(stream);
fgetc(stream);
while(ch!
=EOF)
{
putchar(ch);
ch=fgetc(stream);
}
if(feof(stream))
printf("Wehavereachedend-of-file\n");
fclose(stream);
return0;
}
feof和EOF都是检测文件到没到结尾,但是feof比EOF更安全些!
(3)fputs()函数
原型:
intfputs(char*string,FILE*stream);
作用:
向文件写入一个字符串
调用形式:
fputs(字符串,文件型指针变量);
返回值:
0成功
EOF失败
注意:
字符串的结束标志’\0’不写入。
(4)fgets()函数
原型:
char*fgets(char*string,intn,FILE*stream);
作用:
从一个文件中读取一个字符串
调用形式:
fgets(字符数组,字符数,文件型指针变量)
fgets(str,n,fp);
读取成功返回字符数组str的首地址。
遇到换行或文件结束标志EOF读取结束
读取数据为n-1个字符,并加上字符串结束标志’\0’
例:
#include
#include
intmain(void)
{
FILE*fp=NULL;
charstring[]="Thisisatest";
charmsg[20];
/*以追加的方式打开文件*/
fp=fopen("D:
/test.txt","w+");
/*写一个字符串到文件*/
fwrite(string,strlen(string),1,fp);
/*移动文件指针到头部*/
fseek(fp,0,SEEK_SET);
/*读取一行字符*/
fgets(msg,strlen(string)+1,fp);
/*打印读取字符*/
printf("%s\n",msg);
fclose(fp);
return0;
}
(5)fprintf()函数
原型:
intfprintf(FILE*stream,char*format,[argument,...]);
作用:
按照格式要求将数据写入文件
调用形式:
fprintf(文件型指针变量,格式控制,输出列表)
例:
fprintf(fp,"%ld,%s,%5.1f",num,name,score);
它的作用将变量num、namescore分别按照“%ld,%s,%5.1f”格式写入文件的当前的位置。
(6)fscanf()函数
原型:
intfscanf(FILE*stream,char*format,[argument...]);
作用:
按照格式要求从文件中读取数据
调用形式:
fscanf(文件型指针变量,格式控制,输入列表)
Ø主要用于数据文件的读写,即可用于ASCII文件也可以用二进制文件;
(7)fread()函数
原型:
intfread(void*ptr,intsize,intnitems,FILE*stream);
作用:
从文件中读出成批的数据块
调用形式:
fread(从文件读取的数据块的存放地址,一个数据块的字节数,数据块的个数,文件型指针变量)
返回值:
成功返回实际从文件中读取数据块的个数
(8)fwrite()函数
原型:
intfwrite(void*ptr,intsize,intnitems,FILE*stream);
作用:
将成批的数据写入文件
调用形式:
fwrite(写入文件的数据块存放地址,一个数据块的字节数,数据块个数,文件型指针变量)
返回值:
成功返回实际写入的块的个数
(9)putw()
功能:
把一字符或字送到流中
用法:
intputw(intw,FILE*stream);
(10)getw()
功能:
从流中取一整数
用法:
intgetw(FILE*strem);
文件其它常用函数
文件在使用时,指向打开的文件的指针可以指示文件的当前位置,当每次读取或写入数据时,是从文件指针的当前位置开始读取或写入数据的,然后指针自动移动到读写下一个数据的位置,所以文件指针的定位非常重要。
函数:
feof()、rewind()、fseek()、ftell()
1.函数feof()
函数feof用来检测一个指向文件的指针,是否已经指到了文件最后的结束标志EOF。
调用形式:
feof(文件型指针变量)
如果文件型指针指向的文件当前位置为结束标志EOF,则函数返回一个非0值,否则返回0值。
2.函数rewind()
函数rewind将令指向文件的指针重新指向文件的开始位置,函数无返回值
调用形式:
rewind(文件型指针变量)
3.函数fseek()
函数fseek可以将使得指向文件的指针变量指向文件的任何一个位置,实现随机读写文件
调用形式:
fseek(文件型指针变量,偏移量,起始位置)
原型:
intfseek(FILE*stream,longoffset,intfromwhere);
参数:
fromwhere可以是以下参数:
ØSEEK_SET文件开始位置0
ØSEEK_CUR文件当前位置1
ØSEEK_END文件末尾位置2
Ø如果offset为负数,则表示指针往前移动。
4.ftell()函数
原型:
longftell(FILE*stream);
函数ftell()用于测试指向文件的指针的当前位置
调用形式:
ftell(文件型指针变量)
返回值:
成功返回当前指向的位置距离文件开头的字节数。
失败:
-1L
5.ferror()函数
函数名:
ferror
功能:
检测流上的错误
用法:
intferror(FILE*stream);
在调用各种输入输出函数(如putc、getc、fread、fwrite等)时,如果出现了错误,除了函数返回值有所反映外,还可以用ferror函数检查。
调用形式:
ferror(fp);
如果ferror返回值为0(假),表示出错,如果返回一个非0值表示出错,对同一个文件每一次调用输入输出函数,均产生一个新的ferror函数值,因此应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。
在执行fopen函数时,ferror函数的初始值自动置为0.
6.clearerr()函数
函数名:
clearerr
功能:
复位错误标志
用法:
voidclearerr(FILE*stream);
#include
/************************************************************************/
/*当打开的文件test.txt中有数据时,不提示Errorreadingfromtest.txt
当打开的文件test.txt中无数据时,提示Errorreadingfromtest.txt
/************************************************************************/
intmain(void)
{
FILE*fp=NULL;
fp=fopen("D:
/test.txt","w+");
(void)getc(fp);
/*getc为从字符流中读取字符*/
if(ferror(fp))
{
printf("Errorreadingfromtest.txt\n");
clearerr(fp);
}
fclose(fp);
return0;
}
C++文件
1.概述:
在C++程序中使用的保存数据的文件按存储格式分为两种:
✧字符格式文件,简称字符文件
✧内部格式文件,简称字节文件
✧字符文件又称ASCII文件或文本文件,字节文件又称二进制文件
✧迄今为止,我们讨论的输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。
在实际应用中,常以磁盘文件作为对象。
即从磁盘文件读取数据,将数据输出到磁盘文件。
✧所谓“文件”,一般指存储在外部介质上数据的集合。
一批数据是以文件的形式存放在外部介质上的。
操作系统是以文件为单位对数据进行管理的。
要向外部介质上存储数据也必须先建立一个文件(以文件名标识),才能向它输出数据。
✧外存文件包括磁盘文件、光盘文件和U盘文件。
目前使用最广泛的是磁盘文件。
✧对用户来说,常用到的文件有两大类,一类是程序文件(programfile)。
一类是数据文件(datafile)。
程序中的输入和输出的对象就是数据文件。
✧根据文件中数据的组织形式,可分为ASCII文件和二进制文件。
✧对于字符信息,在内存中是以ASCII代码形式存放的,因此,无论用ASCII文件输出还是用二进制文件输出,其数据形式是一样的。
但是对于数值数据,二者是不同的。
例如有一个长整数100000,在内存中占4个字节,如果按内部格式直接输出,在磁盘文件中占4个字节,如果将它转换为ASCII码形式输出,则要占6个字节,见图
2.文件流类与文件流对象
文件流是以外存文件为输入输出对象的数据流。
输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。
每一个文件流都有一个内存缓冲区与之对应。
请区分文件流与文件的概念。
文件流本身不是文件,而只是以文件为输入输出对象的流。
若要对磁盘文件输入输出,就必须通过文件流来实现。
(1)ifstream类,它是从istream类派生的。
用来支持从磁盘文件的输入。
(2)ofstream类,它是从ostream类派生的。
用来支持向磁盘文件的输出。
(3)fstream类,它是从iostream类派生的。
用来支持对磁盘文件的输入输出。
要以磁盘文件为对象进行输入输出,必须定义一个文件流类的对象,通过文件流对象将数据从内存输出到磁盘文件,或者通过文件流对象从磁盘文件将数据输入到内存。
其实在用标准设备为对象的输入输出中,也是要定义流对象的,如cin,cout就是流对象,C++是通过流对象进行输入输出的。
由于cin,cout已在iostream.h中事先定义,所以用户不需自己定义。
在用磁盘文件时,由于情况各异,无法事先统一定义,必须由用户自己定义。
此外,对磁盘文件的操作是通过文件流对象(而不是cin和cout)实现的。
文件流对象是用文件流类定义的,而不是用istream和ostream类来定义的。
可以用下面的方法建立一个输出文件流对象:
ofstreamoutfile;
现在在程序中定义了outfile为ofstream类(输出文件流类)的对象。
但是有一个问题还未解决:
在定义cout时已将它和标准输出设备建立关联,而现在虽然建立了一个输出文件流对象,但是还未指定它向哪一个磁盘文件输出,需要在使用时加以指定。
可以分为3类:
输入流、输出流以及输入/输出流,相应地必须说明为ifstream、ofstream以及fstream类的对象,例如:
ifstreamifile;//说明一个输入流对象
ofstreamofile;//说明一个输出流对象
fstreamiofile;//说明一个输入/输出流对象
说明流对象后,可以使用open()函数打开文件建立连接。
函数open()原型为:
voidopen(constchar*filename,intmode,intprot=filebuf:
:
openprot);
mode参数为打开模式,取值为下列值之一:
模式名
用途
ios:
:
in
以输入(读)方式打开文件
ios:
:
out
以输出(写)方式打开文件
ios:
:
app
以输出追加方式打开文件
ios:
:
ate
文件打开时,指针位于文件尾
ios:
:
trunc
如果文件存在,将其长度截断为0并清除原有内容,如果文件不存在,则创建新文件
ios:
:
nocreate
打开已有文件,若不存在打开失败
ios:
:
noreplace
文件存在,打开失败,除非设置:
ios:
:
ate或ios:
:
app
ios:
:
binary
以二进制方式打开文件,缺省时为文本方式
ios:
:
in|ios:
:
out
以读写方式打开文件
ios:
:
out|ios:
:
binary
以二进制写方式打开文件
ios:
:
in|ios:
:
binary
以二进制读方式打开文件
Ø对于ifstream流,mode的默认值为ios:
:
in;对于ofstream流,mode默认值为Ios:
:
out
Ø与其他状态标志一样,mode的符号常量可以用位或运算“|”组合在一起,如ios:
:
in|ios:
:
binary表示以只读方式打开二进制文件。
Øprot决定文件的访问方式,取值为:
0普通文件
1只读文件
2隐含文件
4系统文件
一般情况下,该访问方式使用默认值。
❑每个文件流类中都提供有一个关闭文件的成员函数close()。
❑当打开的文件操作结束后,就需要关闭它,使文件流与对应的物理文件断开联系,并能够保证最后输出到文件缓冲区中的内容,无论是否已满,都将立即写入到对应的物理文件中。
❑文件流对应的文件被关闭后,还可以利用该文件流调用open成员函数打开其他的文件。
1.打开磁盘文件
打开文件是指在文件读写之前做必要的准备工作,包括:
(1)为文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。
(2)指定文件的工作方式。
以上工作可以通过两种不同的方法实现。
(1)调用文件流的成员函数open。
如
ofstreamoutfile;//定义ofstream类(输出文件流类)对象outfile
outfile.open(″f1.dat″,ios:
:
out);//使文件流与f1.dat文件建立关联
调用成员函数open的一般形式为文件流对象.open(磁盘文件名,输入输出方式);
磁盘文件名可以包括路径,如″c:
\\new\\f1.dat″,如缺省路径,则默认为当前目录下的文件。
(2)在定义文件流对象时指定参数
在声明文件流类时定义了带参数的构造函数,其中包含了打开磁盘文件的功能。
因此,可以在定义文件流对象时指定参数,调用文件流类的构造函数来实现打开文件的功能。
如
ostreamoutfile(″f1.dat″,ios:
:
out);
一般多用此形式,比较方便。
作用与open函数相同。
输入输出方式是在ios类中定义的,它们是枚举常量,有多种选择,
说明:
①新版本的I/O类库中不提供ios:
:
nocreate和ios:
:
noreplace。
②每一个打开的文件都有一个文件指针。
③可以用“位或”运算符“|”对输入输出方式进行组合。
④如果打开操作失败,open函数的返回值为0(假),如果是用调用构造函数的方式打开文件的,则流对象的值为0。
2.关闭磁盘文件
在对已打开的磁盘文件的读写操作完成后,应关闭该文件。
关闭文件用成员函数close。
如
outfile.close();//将输出文件流所关联的磁盘文件关闭
所谓关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样,就不能再通过文件流对该文件进行输入或输出。
此时可以将文件流与其他磁盘文件建立关联,通过文件流对新的文件进行输入或输出。
如
outfile.open(″f2.dat″,ios:
:
app|ios:
:
nocreate);
此时文件流outfile与f2.dat建立关联,并指定了f2.dat的工作方式。
对二进制的操作:
二进制文件不是以ASCII代码存放数据的,它将内存中数据存储形式不加转换地传送到磁盘文件,因此它又称为内存数据的映像文件。
因为文件中的信息不是字符数据,而是字节中的二进制形式的信息,因此它又称为字节文件。
对二进制文件的操作也需要先打开文件,用完后要关闭文件。
在打开时要用ios:
:
binary指定为以二进制形式传送和存储。
二进制文件除了可以作为输入文件或输出文件外,还可以是既能输入又能输出的文件。
这是和ASCII文件不同的地方。
1.用成员函数read和write读写二进制文件
对二进制文件的读写主要用istream类的成员函数read和write来实现。
这两个成员函数的原型为
istream&read(char*buffer,intlen);
ostream&write(constchar*buffer,intlen);
字符指针buffer指向内存中一段存储空间。
len是读写的字节数。
调用的方式为
a.write(p1,50);
b.read(p2,30);
2.与文件指针有关的流成员函数
在磁盘文件中有一个文件指针,用来指明当前应进行读写的位置。
对于二进制文件,允许对指针进行控制,使它按用户的意图移动到所需的位置,以便在该位置上进行读写。
文件流提供一些有关文件指针的成员函数。
说明:
(1)这些函数名的第一个字母或最后一个字母不是g就是p。
(2)函数参数中的“文件中的位置”和“位移量”已被指定为long型整数,以字节为单位。
“参照位置”可以是下面三者之一:
•ios:
:
beg文件开头(beg是begin的缩写),这是默认值。
•ios:
:
cur指针当前的位置(cur是current的缩写)。
•ios:
:
end文件末尾。
它们是在ios类中定义的枚举常量。
举例如下:
infile.seekg(100);//输入文件中的指针向前移到100字节位置
infile.seekg(-50,ios:
:
cur);//输入文件中的指针从当前位置后移50字节
outfile.seekp(-75,ios:
:
end);//输出文件中的指针从文件尾后移50字节
C++文件总结至此,若有更新,随后通知
MFC文件概述
•CFile类有两种构造函数,使用默认的构造函数创建一个CFile对象后,还需要使用Open()函数将文件打开。
使用带参数的构造函数创建一个CFile对象的同时,就将该文件打开了。
下面对这两种打开文件的方式分别进行介绍。
1.使用默认的构造函数打开文件
•CFile类默认的构造函数原型如下:
•
•如果在构造CFile类的对象采用这个默认的构造函数,那么仅仅创建了一个对象,而并没有打开文件。
此时,需要用到Open()函数。
Open()函数的原型如下:
•
•lpszFileName:
用于指定文件名。
•nOpenFlags:
指定打开文件的方式。
该参数可以几个值的组合,以“|”进行分隔。
该参数的取值如下表所示。
•pError:
指向CFi