下面这个例程实现的功能是:如果文件不存在,就建立文件,否则就打开文件以注的方式
使用,如果点击WriteBtn按钮写文件,数据会被追回,但如果点ReWriteBtn按钮写文件,
新数据会覆盖上一次写的的数据。但要注意,如果文件放关闭后重新打开,原来的光标位置
就会无效,所以如果每次点了ReWriteBtn写数据后就关闭文件又重新打开的话,其结果还
是追回模式而不是覆盖模式。
这只是一个简单的例子,你可以参照它完成更复杂的业务逻辑,关键就是自己灵活设置光标
了。
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
FILE *fp;
long CurPos=0;
const char sFileName[]="C://Test1.txt";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WriteBtnClick(TObject *Sender)
{
int iNumber;
if (!fp){
MessageBox(Handle, "打开文件失败,不能写入", "Error", MB_ICONERROR);
return;
}
iNumber = atoi(Edit1->Text.c_str());
fwrite(&iNumber, sizeof(iNumber), 1, fp);
if (fflush(fp)==0) //清空缓存,将数据写到硬盘上
MessageBox(Handle, "OK!", "Write", MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ReWriteBtnClick(TObject *Sender)
{
int iNumber;
if (!fp){
MessageBox(Handle, "打开文件失败,不能写入", "Error", MB_ICONERROR);
return;
}
iNumber = atoi(Edit1->Text.c_str());
fseek(fp, CurPos, SEEK_SET);
fwrite(&iNumber, sizeof(iNumber), 1, fp);
if (fflush(fp)==0)
MessageBox(Handle, "OK!", "Write", MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//不能用"wb+"打开文件,因为它会重写文件,也不能用"ab+"打开文件,
//因为每一次写都会变成追加模式
if ((fp = fopen(sFileName, "rb+"))==NULL){
//打不开文件,建立之
if ((fp = fopen(sFileName, "wb+"))==NULL)
MessageBox(Handle, "打开文件失败!", "Error", MB_ICONERROR);
}
//文件被关闭后,光标将无效,重新打开后关标将被放在文件尾
fseek(fp, 0, SEEK_END);
CurPos = ftell(fp);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if (fp)
fclose(fp);
}
//---------------------------------------------------------------------------