C++LinuxCMFC文件学习大全.docx

上传人:b****8 文档编号:11208797 上传时间:2023-02-25 格式:DOCX 页数:34 大小:779.44KB
下载 相关 举报
C++LinuxCMFC文件学习大全.docx_第1页
第1页 / 共34页
C++LinuxCMFC文件学习大全.docx_第2页
第2页 / 共34页
C++LinuxCMFC文件学习大全.docx_第3页
第3页 / 共34页
C++LinuxCMFC文件学习大全.docx_第4页
第4页 / 共34页
C++LinuxCMFC文件学习大全.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

C++LinuxCMFC文件学习大全.docx

《C++LinuxCMFC文件学习大全.docx》由会员分享,可在线阅读,更多相关《C++LinuxCMFC文件学习大全.docx(34页珍藏版)》请在冰豆网上搜索。

C++LinuxCMFC文件学习大全.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1