Vb教程 Vb.net教程 Vfp教程 C/C++教程 Vc/Vc++教程 Delphi教程 Java教程 Powerbuilder
  杀毒频道 | 短信频道 | 网络电视 | 论文中心 | 学上网 | 学软件 | 网页特效 | 电脑基础 | 论坛  
  NCRE | 软考 | CET | 职称英语 | 司法考试 | 报关员 | 公务员 | CATTI | CPA考试  
  Html教程 | Css教程 | Xml教程 | Asp教程 | Asp.net | Php教程 | Jsp教程 | Linux教程 | QQ技巧  
Photoshop Illustrator ImageReady Maya教程 3D Max教程 Lightscape Coredraw教程 Authorware Autocad教程 Freehand教程
Access教程 Mysql教程 Sql server Oracle教程 Word教程 Excel教程 Powerpoint Frontpage Asp.net源码 Php源代码
Flash教程 Fireworks Dreamweaver C#教程 outlook教程 系统安装 vbscript教程 Javascript Jsp源代码 Asp源代码
您的位置:首页 >> C/C++教程 >> 正文

Borland C++Builder 5.0教程(13)
文章来源:pconline 作者:陈明浩

文件的存取

   C++Builder按照数据在磁盘的存取方式,将数据文件分成顺序存取和随机存取文件两种。

顺序存取文件(Sequential Access File)

   简称“顺序文件”,数据写入驱动器的方式是后输入的数据放在以前输入数据的后面,按照数据的先后次序一个接一个的放。若要读取数据,也是由第一条记录开始读取,新增的数据放在旧数据的最后面。这种数据文件每一条记录的长度都不一样,虽然比较节约空间,可是每次查询都必须从头开始找起,越在后的数据找寻时间就越久。

随机存取文件(Random Access File)

   简称“随机文件”,每一条记录在磁盘中所占的长度都相同。数据存入磁盘的方式没有先后次序的限制;由于每个数据占用的长度固定,查询时只要告知第几个数据便可利用公式算出该数据的位置,快速地存取那个数据。所以不管数据在前还是在后,找寻的时间都大约相同,至于每个数据所占磁盘空间长度应设置多长,必须以一条纪录长度最长的那个为基准,当每个数据实际长度差异很时,试用随机文件会比较浪费磁盘空间。

一、 数据文件的操作方式

   数据文件是通过程序产生的,一般我们对数据文件的操作,大致采用下列七种方式来维护数据文件内的数据:

1.建立文件操作:用来产生一个新的数据文件并确定使用哪种存取模式来读写数据文件。

2.新增操作:在指定的数据文件中加入新的数据。

3.删除操作:在指定的数据文件中,将指定的数据去掉。

4.修改操作:在指定的数据文件中对指定数据的内容做修改。

5.查询操作:找出满足条件的数据显示在屏幕上,适用于少量的数据。

6.打印操作:找出满足条件的所以数据,由打印机列出,适用于大量数据。

7.分析操作:将满足特定条件的数据挑出来,作为统计、分析决策的参考。

二、 常用的文件函数

详细说明见下表



打开文件

语法:FILE*fopen(const char *filename,const char *mode);

功能:以指定模式打开文件

『说明』

1.char *filename:可以为一个字符串,用它来代表要打开的文件或设备,若文件不在目前的文件夹下,就必须在文件名前加上路径名称。

2.Char mode(模式):用来设置要打开文件属于哪种类型的数据文件以及数据存取模式,如下表:

二、 常用的文件函数

语法:int fclose(FILE *stream);

功能:将文件指针所对应的数据文件关闭

1.Stream为文件指针,fclose(file1);

2.任何已打开的文件,不再使用时,要记得关闭,这样才能将占用的缓冲区归还系统。

3.以w或a模式打开的文件,fclose函数会先将存放在缓冲区那的数据写入文件中,再将数据文件关闭。

Feof函数

语法:int fileno(FILE *stream)

功能:用来测试文件是否结束

1.再读取数据文件中的数据时,可用feof函数来判断文件的指针是否已经指到文件的结尾。

2.如果已经指到文件结尾,表示数据已经读完,feof函数值传回true,否则为false。

3.此函数一半再顺序文件中读取数据时,用来判断该文件是否读完。

Fileno函数

语法:int fileno(FILE *stream);

功能:将指定数据文件的代码(handle)传回

1.传回值为证书代码(handle),以byte为单位。

Filelength函数

语法:int filelength(int handle);

功能:将代码所代表数据文件的长度传回

1.传回值为长整形,以byte为单位。
顺序文件

   “顺序文件”就是指数据在做存取的时候,学要按照数据存入的先后次序处理,就像使用录音带一样,如果你想听第五首歌,那么必须要绕过前四首。所以顺序文件在写数据的时候是按照一个接一个的顺序写入的,而读数据的时候也一样。顺序文件的特性和使用时机如下:

特性

1.每一条纪录长度可以不一样。

2.增加数据时,一定要从原有的数据的最后一条开始加入。

3.每次找寻数据时都要从头开始找起,不但费时而且操作效率低。

4.若每条数据的长度差异很大时,使用顺序文件来存数据可节省内存空间。

使用时机

1.每条记录长度无法确定时。

2.数据不经常做新增、修改和删除操作时。

3.处理数据时时按照顺序连续处理,而非跳来跳去。

一、顺序文件数据的写入

   c++builder对顺序文件数据的写入,提供了fprintf函数。

语法:int fprintf(FILE *stream,const char *format[,argument,……]);

功能:一格式话讲数据写于文件中

1.Stream:文件指针必须和打开文件fopen函数的文件指针相同。

2.Format为格式化输出。

例子1

由键盘输入学生的资料并存入磁盘中。

『分析说明』

1.可以通过文字框输入学生的学号、姓名和成绩,如下图

2.源代码分析

#include

#include //引用stdio.h库

FILE *outf; //定义一个文件指针

#pragma hdrstop

#include "Unit1.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

void __fastcall TForm1::FormCreate(TObject *Sender)

{

outf=fopen("c:\\studentinfo.txt","w+"); //打开c:\studentinfo.txt文件

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{

String s_name,s_number;

int mark;

s_number=Edit1->Text;

s_name=Edit2->Text;

mark=StrToInt(Edit3->Text);

fprintf(outf,"%s %s %d",s_number,s_name,mark); //把学号、名字和成绩保存到文件里

Edit1->Text="";

Edit2->Text="";

Edit3->Text="";

}

void __fastcall TForm1::Button2Click(TObject *Sender)

{

String s_name,s_number;

int mark;

if(Edit1->Text!="")

{

s_number=Edit1->Text;

s_name=Edit2->Text;

mark=StrToInt(Edit3->Text);

fprintf(outf,"%s %s %d",s_number,s_name,mark);

}

fclose(outf); //关闭文件

Form1->Close();

}

二、 顺序文件数据文件的读取

   C++Builder对顺序文件数据的读取,提供了fscanf函数。

语法:int fscanf(FILE *stream, const char *format[, address, ...]);

功能:以格式化由文件中读取数据,存于指定变量中


1. 数值变量之前要加&符号;

2. Format格式化输入。

例子2



代码分析:

FILE *inf; //定义文件指针

bool flag; //定义一个布尔变量,标志文件是否打开的状态

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{

char *number=new char;

char *name=new char; //定义两个字符串指针,存放学号和姓名

int mark;

if(!feof(inf))

{

fscanf(inf,"%s %s %d",number,name,&mark);

Edit1->Text=number;

Edit2->Text=name;

Edit3->Text=IntToStr(mark);

}

else

{

fclose(inf); //关闭文件

flag=false;

}

}

void __fastcall TForm1::FormCreate(TObject *Sender)

{

flag=false;

Button3Click(Sender);

}

void __fastcall TForm1::Button3Click(TObject *Sender)

{

if(flag)

{

fclose(inf);

}

inf=fopen("c:\\studentinfo.txt","r+"); //打开文件

flag=true;

Button1Click(Sender);

}

void __fastcall TForm1::Button2Click(TObject *Sender)

{

fclose(inf);

Form1->Close();

}
随机文件

   如果要让文件中的数据能够随意存取,而不要按照数据的先后顺序写入或者读出,那么就需要利用随机文件。同一个随机文件中每一条记录在磁盘中所使用的长度是一定的。随机文件中每一条记录都指定一个编号,存取时按照编号计算出其所存放位置,来存取数据。

Fseek函数

语法:int fseek(FILE *stream, long offset, int whence);

功能:将指针移动到文件指定位置


1. stream:文件指针名称必须和fopen函数的文件指针名称相同;

2. whence:文件位置;



3. offset:相对于whence所在位置,以Byte为单位。

fwrite

语法:size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);

功能:将数据写入随机文件中


fread

语法:size_t fread(void *ptr, size_t size, size_t n, FILE *stream);

功能:将数据由随机文件中读出


1. stream:为文件指针;

2. ptr:为文件指针或存取变量名称,若为变量前面加&;

3. size:一条记录大小,以Byte为单位;

4. n:每次存取多少个数据。

例子3:

   以随机文件方式输入和读取学生数据。

1. 输入学生数据



代码分析:

#include

#include

#include //引用io.h和stdio.h库

#pragma hdrstop

#include "Unit1.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

struct student //定义学生记录的结构

{

int number; //学号

char name[12]; //姓名

int mark; //成绩

};

student stu; //定义一个学生记录结构的别名

int total; //定义一个保存所有记录总数的变量

FILE *file1; //定义个文件指针

TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{

stu.number=StrToInt(Edit1->Text);

strcpy(stu.name,Edit2->Text.c_str());

stu.mark=StrToInt(Edit3->Text);//把学生的学号,姓名和成绩保存到结构中

fseek(file1,sizeof(stu)*(total-1),SEEK_SET); //把文件指针移动到最后一条记录之后

fwrite(&stu,sizeof(stu),1,file1); //把一条学生记录保存到磁盘上

total=total+1;

Edit1->Text="";

Edit2->Text="";

Edit3->Text="";

}

void __fastcall TForm1::Button2Click(TObject *Sender)

{

if(Edit1->Text!="")

{

stu.number=StrToInt(Edit1->Text);

strcpy(stu.name,Edit2->Text.c_str());

stu.mark=StrToInt(Edit3->Text);

fseek(file1,sizeof(stu)*(total-1),SEEK_SET);

fwrite(&stu,sizeof(stu),1,file1);

}

fclose(file1); //关闭文件

Form1->Close();

}

void __fastcall TForm1::FormActivate(TObject *Sender)

{

file1=fopen("c:\\student.txt","a+"); //打开文件

total=filelength(fileno(file1))/sizeof(stu); //计算文件记录总数,保存到变量中

}
2.读出学生数据



代码分析:

#include

#include

#include

#pragma hdrstop

#include "Unit1.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

struct student

{

int number;

char name[12];

int mark;

};

student stu;

int total;

FILE *file1;

TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

void __fastcall TForm1::Button2Click(TObject *Sender)

{

fclose(file1);

Form1->Close();

}

void __fastcall TForm1::FormActivate(TObject *Sender)

{

file1=fopen("c:\\student.txt","a+");

total=filelength(fileno(file1))/sizeof(stu)+1;

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{

int number; //定义一个变量存放要查询学生的学号

number=StrToInt(Edit1->Text);

if(number>0&&number<=total)

{

fseek(file1,sizeof(stu)*(number-1),SEEK_SET);//移动文件指针到指定位置上

fread(&stu,sizeof(stu),1,file1); //读出学生记录

Edit1->Text=IntToStr(number);

Edit2->Text=stu.name;

Edit3->Text=IntToStr(stu.mark);//显示学生记录

}

}

[返回]

编程语言 web开发 数据库 网络技术 操作系统 服务器 网页设计 图形设计 办公软件 常用软件 学电脑

Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved.
关于本站 | 版权声明 | 联系我们 | 友情链接 |
编程入门网 版权所有