关于文件的读与写

gyj_china 2003-06-20 04:22:03
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int FHandle;
if (FileExists("Logo.txt"))
FHandle = FileOpen("Logo.txt", fmOpenWrite);
else
FHandle = FileCreate("Logo.txt");

FileSeek(FHandle, 0, 2); //指针移到文件尾

AnsiString temp = Memo2->Lines->Text;
int FLength = temp.Length() + 2;
char *buf = temp.c_str();

FileWrite(FHandle, buf, FLength); //写文件
FileClose(FHandle);
}
//----------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int FHandle = FileOpen("Logo.txt", fmOpenRead);
int FLength = FileSeek(FHandle,0,2); //获取文件的长度
FileSeek(FHandle,0,0);

char *pszBuffer = new char[FLength];
FileRead(FHandle, pszBuffer, FLength);//读取文件
pszBuffer[FLength] = '\0';

FileClose(FHandle);

Memo1->Lines->Text = (LPTSTR)pszBuffer;//显示
delete [] pszBuffer;
}
注:记录可以追加到文件中,但不能正常读取。只能读取第一次写入的内容,不能读取 面追加的,有谁知道是什么原因吗?
...全文
51 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyszh 2003-06-23
  • 打赏
  • 举报
回复
qibo999(行路者)很对。
可修改如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int FHandle;
if (FileExists("Logo.txt"))
FHandle = FileOpen("Logo.txt", fmOpenWrite);
else
FHandle = FileCreate("Logo.txt");

FileSeek(FHandle, 0, 2); //指针移到文件尾

AnsiString temp = Memo2->Lines->Text;
int FLength = temp.Length();

FileWrite(FHandle, temp.c_str(), FLength); //写文件
FileClose(FHandle);
}
//----------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int FHandle = FileOpen("Logo.txt", fmOpenRead);
int FLength = FileSeek(FHandle,0,2); //获取文件的长度
FileSeek(FHandle,0,0);

char *pszBuffer = new char[FLength+1];
int FLength1=FileRead(FHandle, pszBuffer, FLength);//读取文件
pszBuffer[FLength1] = '\0';

FileClose(FHandle);

Memo1->Lines->Text = pszBuffer;//显示
delete [] pszBuffer;
}
constantine 2003-06-22
  • 打赏
  • 举报
回复
up
qibo999 2003-06-22
  • 打赏
  • 举报
回复
关键是写的时候,多写了2字节的东西,一定要有多少字符就写多少!而读的时候,要分配内存的时候,要欲留出字符串结尾空字符的位置!至于AnsiString的临时指针c_str(),在这里这样用也没什么问题,只要不是赋值,其间也没进行其它的操作,是可以用的。
...
AnsiString temp = Memo2->Lines->Text;
int FLength = temp.Length(); //这里去掉+2
char *buf = temp.c_str();

FileWrite(FHandle, buf, FLength);
FileClose(FHandle);
...

char *pszBuffer = new char[FLength+1]; //这里要+1,否则会溢出
int aa = FileRead(FHandle, pszBuffer, FLength); //最好取一下实际读出的数
pszBuffer[aa] = '\0'; //这里用实际读出的数比较好

FileClose(FHandle);

Memo1->Lines->Text = pszBuffer;//其实,直接用就可以了,没必要(LPTSTR)
delete [] pszBuffer;

newhander 2003-06-22
  • 打赏
  • 举报
回复
up
kingfish 2003-06-22
  • 打赏
  • 举报
回复
c_str()返回的是临时指针

多写的2个字符你知道是什么?

你的显示是当字符串显示的
Memo1->Lines->Text = (LPTSTR)pszBuffer;//显示
GodBirdFlying 2003-06-22
  • 打赏
  • 举报
回复
Button1Click()
{
AnsiString temp = Memo2->Lines->Text;
int FLength = temp.Length() + 2; //把这个+2 变成 +1
char *buf = temp.c_str();
.....
}

Memo1->Lines->LoadFormFile("Logo.txt");
Memo1->Lines->SaveToFile("Logo.txt");
也可以实现读写文件
叶子哟 2003-06-20
  • 打赏
  • 举报
回复
int FLength = temp.Length() + 2;
char *buf = temp.c_str();
-----------------------------------
这样用,一方面增加了两个中间无用的变量
    另外多写了两个空字符,写入的长度和实际字符不一致,导致未知错误,如果你确实要加这两个字节,那你就写点什么!
    第三、buf还是先new出固定长度使用为佳,可以用StrPCopy来转换
Behard 2003-06-20
  • 打赏
  • 举报
回复
你的代码的问题非常普遍
int FLength = temp.Length() + 2; 时
写文件时可能是最后的两个字符为 \0 ,而你使用 LPSTR 来显示,而指针中间存在 \0 时
后面的数据是不能显示的

如果你不相信的话,使用 Debug 进入 Watch 看看是否读取成功
Purple_Z 2003-06-20
  • 打赏
  • 举报
回复
楼上,这样用在这里没有任何问题,
gyj_china 2003-06-20
  • 打赏
  • 举报
回复
程序中还有一条语句要更正
char *pszBuffer = new char[FLength];更正为
char *pszBuffer = new char[FLength+1];不然会发生内存泻漏。
至于int FLength = temp.Length() + 2;
改了之后你可以打开Logo.txt看一下,写两次数据之后再看:)因为写一次看不去效果。
gyj_china 2003-06-20
  • 打赏
  • 举报
回复
小兵的方法可以,但不是我要的。XuWei的方法可以,但得不到正确的结果。
李狼的最直观,但推动了我设计的初终,不可取。
至于八百里秦川@龙城异客的
char *buf = temp.c_str();
不要这样用!
难道有更好的办法??
kingfish 2003-06-20
  • 打赏
  • 举报
回复
char *buf = temp.c_str();
不要这样用!
xuv2002 2003-06-20
  • 打赏
  • 举报
回复
写文件里面
AnsiString temp = Memo2->Lines->Text;
int FLength = temp.Length() + 2; //去掉这个+2
char *buf = temp.c_str();

读文件里面可以直接使用
Memo1->Lines->LoadFormFile("Logo.txt");
Lewolf 2003-06-20
  • 打赏
  • 举报
回复
Memo2->Lines->LoadFromFile(...);
Memo2->Lines->SaveToFile(...);
叶子哟 2003-06-20
  • 打赏
  • 举报
回复
AnsiString temp = Memo2->Lines->Text;
FileWrite(FHandle, temp.c_str(), temp.Length()); //写文件
wyb_45 2003-06-20
  • 打赏
  • 举报
回复
还是使用fopen,ANSI C

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧