怎样才能将一个不定长的字符串写入一个文件呀?(5分)

  • 主题发起人 主题发起人 sweetychild
  • 开始时间 开始时间
S

sweetychild

Unregistered / Unconfirmed
GUEST, unregistred user!
用 blockWRITE(fp,filebuffer,1);将FILEBUFFER定义成STRING系统报错定义成array[0..30]of char
又不方便将字符串赋值进去
 
可以几十个字符一组这样写入,重复至写完
 
可是我要写入的字符串是不定长的,有没有别的办法啊
 
用动态数组
var
x:array of char;
begin
setLength(x,100);
//可以随意改变100这个值
//做你的程序
end;
 
可是要怎样才能把字符串赋值进到字符数组里呢?我想整体赋值却通不过
 
摘自Hubdog的葵花宝典:文件拷贝,里面的代码可以借鉴。
procedure FileCopy(const FromFile, ToFile: string);
var
FromF, ToF: file;
NumRead, NumWritten: Word;
Buf: array[1..2048] of Char;
begin
AssignFile(FromF, FromFile);
Reset(FromF, 1)
{ Record size = 1 }

AssignFile(ToF, ToFile)
{ Open output file }
Rewrite(ToF, 1)
{ Record size = 1 }
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
BlockWrite(ToF, Buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
CloseFile(ToF);
end;
 
假如你的字符串是str
BlockWrite(fp, PChar(str)^ , Length(str))
注意PChar(str)^后面小小的 ^ 号不能少
 
谢谢PIPI成功了,不过虽然我的STR只有三个字符存他的文件却好长好长,WHY?
另外使用BLOCKREAD的时候是不是有关参数也是和上面的格式一样就可以取出呢?
 
str你setlength了?
 
没有啊,我就是将filebuffer:='西子湖畔';放在之前赋了值啊,其它什么都没做
 
filebuffer是什么类型?string?
保存进去的除了 西子湖畔 后面是什么内容?保存了多少字节?
 
filebuffer是string类型,保存进去的这次是‘西子湖畔 ’,其实工作状态下是不定长的COMBOBOX
中取来的字符串,从2个汉字或数字到10个汉字或数字不等,用你说的办法现在写进去IT是可以了,
用UEDIT看了一下前几个字符是西子湖畔后面是一堆乱码所以我才困惑怎样才能把这几个字用
BLOCKREAD读出来:(
 
实验写了一个小程序,可以实现,共参考
procedure TForm1.Write_File(l_FileName, l_Str: String);
var
ToF: file;
pStr: PChar;
begin
GetMem(pStr, Length(l_Str) + 1);
StrPCopy(pStr, l_Str);

AssignFile(ToF, l_FileName);
Rewrite(ToF, 1);
BlockWrite(ToF, pStr^, Length(l_Str));
CloseFile(toF);
FreeMem(pStr);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Write_File('E:/2.Txt', Memo1.Text);
end;
 
后面的内容以前保存的吧,写入之前要截断,或者先删除旧的文件
 
setlength(filebuffer, 0);
filebuffer := '西子湖畔';
BlockWrite(fp, PChar(str)^ , Length(str));
或者:
var
s: TStringList;
begin
s := TStringList.Create;
s.Text := '西子湖畔';
s.SaveToFile('c:/abc.txt');
s.Free;
end;
 
没必要用PChar等指针操作的,用s[1]就能传递指针了,你用下面程序看看
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
f:file;
begin
AssignFile(f,'d:/abc.txt');
Reset(f,1);
try
s:=Edit1.Text;
Seek(f,FileSize(f));
BlockWrite(f,s[1],Length(s));
finally
CloseFile(f);
end;
end;
 
后退
顶部