全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1233
推到 Plurk!
推到 Facebook!

TFileStream 在存入檔案時,為何都會多存入一個'?'

尚未結案
kaoworld
一般會員


發表:1
回覆:2
積分:0
註冊:2003-07-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-09-29 10:20:15 IP:61.56.xxx.xxx 未訂閱
小弟不才,在此請教各位先進,這是我第一次使用 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-29 10:32:55 IP:147.8.xxx.xxx 未訂閱
What is definition of guSrvInfo? BTW please enclose your code with [ code ] [ /code ] next time.
sos_admin
版主


發表:121
回覆:697
積分:768
註冊:2003-07-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-29 11:26:57 IP:61.155.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-29 11:45:03 IP:61.56.xxx.xxx 未訂閱
感謝各位先進的回應,我試過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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-29 11:55:24 IP:147.8.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-09-29 13:14:04 IP:61.155.xxx.xxx 未訂閱
kaoworld 兄: 对于record等自定义类型数据,只有将它保存为文件档,然后再可以用“流“传输哦!
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-09-30 06:06:04 IP:203.222.xxx.xxx 未訂閱
 
 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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-09-30 08:12:56 IP:61.56.xxx.xxx 未訂閱
感謝各位先進的幫忙,我已經依照 William 版主的指導找到解決方法了! 原來大家都很熱心的!
系統時間:2024-06-26 23:54:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!