TFileStream 在存入檔案時,為何都會多存入一個'?' |
尚未結案
|
kaoworld
一般會員 發表:1 回覆:2 積分:0 註冊:2003-07-28 發送簡訊給我 |
小弟不才,在此請教各位先進,這是我第一次使用 TFileStream ,程式碼如下,現在的問題是TFileStream 在存入檔案時,為何都會多存入一個'?',造成檔案讀取錯誤,請各位先進幫幫忙,謝謝啦! //***** 程式碼
procedure TForm1.Button1Click(Sender: TObject);
var sFileName: String;
Attrs: Integer;
bDelete: Boolean;
WriteStream: TFileStream;
begin
guSrvInfo.sTitle := Trim('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234');
sFileName := 'C:\text.txt';
if FileExists(sFileName) then begin
//先取得原先的檔案屬性
Attrs := FileGetAttr(sFileName);
FileSetAttr(sFileName, 0);
bDelete := DeleteFile(sFileName);
if bDelete then
//如果檔案刪除成功才能新增檔案,否則只能開啟檔案
WriteStream := TFileStream.Create(sFileName, fmCreate)
else
WriteStream := TFileStream.Create(sFileName, fmOpenWrite);
WriteStream.Write(guSrvInfo, SizeOf(guSrvInfo));
WriteStream.Free;
FileSetAttr(sFileName, Attrs);
end else begin
//存檔
WriteStream := TFileStream.Create(sFileName, fmCreate);
WriteStream.Write(guSrvInfo, SizeOf(guSrvInfo));
WriteStream.Free;
FileSetAttr(sFileName, faReadOnly faArchive);
end;
end; //***** 執行結果
?ABCDEFGHIJKLMNOPQRSTUVWXYZ123
|
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
procedure TForm1.Button1Click(Sender: TObject);
var
sFileName,str: String;
WriteStream: TFileStream;
strstream:TStringStream;
begin
str:= Trim('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234');
sFileName := 'C:\text.txt';
strstream:=TStringStream.Create(str) ;
if FileExists(sFileName) then
begin
FileSetAttr(sFileName, 0);
WriteStream := TFileStream.Create(sFileName, fmOpenWrite);
end
else
WriteStream := TFileStream.Create(sFileName, fmCreate);
try
strstream.Position :=0;
WriteStream.CopyFrom(strstream,0);
finally
strstream.Free ;
WriteStream.Free;
end;
FileSetAttr(sFileName, faReadOnly faArchive);
end; 这样就可以了!
|
kaoworld
一般會員 發表:1 回覆:2 積分:0 註冊:2003-07-28 發送簡訊給我 |
感謝各位先進的回應,我試過sos_admin 前輩的方式確實可行,但是如果變數本身不是String,而是 Record 時又該如何處理呢?
以下再將程式碼完整的貼上!
type NewSaveInfo = Record sTitle: String[29]; //Server的資訊 end; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; guSrvInfo: NewSaveInfo; //保留登錄資訊 implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var sFileName: String; Attrs: Integer; bDelete: Boolean; WriteStream: TFileStream; begin guSrvInfo.sTitle := Trim('ABCDEFGHIJKLMNOPQRSTUVWXYZ1234'); sFileName := 'C:\text.txt'; if FileExists(sFileName) then begin //先取得原先的檔案屬性 Attrs := FileGetAttr(sFileName); FileSetAttr(sFileName, 0); bDelete := DeleteFile(sFileName); if bDelete then //如果檔案刪除成功才能新增檔案,否則只能開啟檔案 WriteStream := TFileStream.Create(sFileName, fmCreate) else WriteStream := TFileStream.Create(sFileName, fmOpenWrite); WriteStream.Write(guSrvInfo, SizeOf(guSrvInfo)); WriteStream.Free; FileSetAttr(sFileName, Attrs); end else begin //存檔 WriteStream := TFileStream.Create(sFileName, fmCreate); WriteStream.Write(guSrvInfo, SizeOf(guSrvInfo)); WriteStream.Free; FileSetAttr(sFileName, faReadOnly faArchive); end; end; |
william
版主 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
No space in [ code ] [ /code ].... BTW, you are using short string and the first byte (i.e. sTitle[0]) stored its length.... For an ansi string you should use this:
if length(AString)>0 then AStream.Write(AString[1],length(AString));And you may want to store the length of you string first.... |
sos_admin
版主 發表:121 回覆:697 積分:768 註冊:2003-07-23 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
ARecord = record xxx... . . . end; . . var Data: array of ARecord; . . SetLength(Data,Size_U_Want) . . . UR_FileStream.Write(Data,Length(Data) * SizeOf(ARecord)); . .Notic: Do not contain any LifeTime Management type in record like String, Object, Dynamic array ....ect, if u want to write them to file cause them won't be calculated in function of SizeOf and won't write anything to file use String[1] ~ String[255] no Object, Dynamic array |
kaoworld
一般會員 發表:1 回覆:2 積分:0 註冊:2003-07-28 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |