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

如何实现缓冲区内容写入文件

尚未結案
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-18 20:15:21 IP:218.64.xxx.xxx 未訂閱
恳请各位前辈帮我看看修改一下delphi 源码! D2array=array of array of double; D1Array=array of Stringlist; //问题1.这样写可行吗?? procedure weight(w:D2Array; n1:integer;n2:integer;name:D1Array); //问题2.这里的n1,n2:integer; 可以合并写吗? var i,j:integer; buffer:double; fp:D1Array; begin fp:=TStringList.create(name,fmOpenWrite); setlength(w,n1,n2); for i:=0 to n1-1 do begin for j:=0 to n2-1 do buffer[i*n2 j]=w[i,j]; end; Stringlist.writeBuffer(buffer,sizeof(buffer),fp);//问题3.这样写对不? Stringlist.Free; setlength(buffer,0); end;
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-18 20:51:23 IP:61.222.xxx.xxx 未訂閱
個人認為您先看一看 Delphi 相關的書籍,在發問。 或者若有C的Source Code 需翻譯至 Delphi 可貼上源碼發問。 D1Array=array of TStringlist; 不懂為何要用到 TStringlist 若是指檔案名稱 使用 D1Array=array of String; //字串陣列 老實說!看了您的源碼。 覺得有點莫名其妙!失禮了.....
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-18 20:58:34 IP:219.80.xxx.xxx 未訂閱
補充:是亂七八糟 < src="http://sourceprovide.deepen.com.tw/K_Top/bp.gif">
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-18 21:04:30 IP:218.64.xxx.xxx 未訂閱
我初学delphi,很多地方不懂,希望你们能多指教。 C源代码如下: void weight(double **w,int n1,int n2,char *name) { int i,j; double *buffer; file *fp; fp=fopen(name,"wb "); buffer=(double*)malloc((n1 1)*(n2 1)*sizeof(double)); for (i=0;i<=n1;i ) { for (j=0;j<=n2;j ) buffer[i*(n2 1)]=w[i][j]; } fwrite((char*)buffer,sizeof(double),(n1 1)*(n2 1),fp); fclose; free(buffer); } 请前辈帮我指出我自己改编delphi(原帖)上的错误,多谢
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-19 09:39:06 IP:218.15.xxx.xxx 未訂閱
多点一下 發表人 -
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-19 09:50:22 IP:218.15.xxx.xxx 未訂閱
引言:
我初学delphi,很多地方不懂,希望你们能多指教。
C源代码如下:
void weight(double **w,int n1,int n2,char *name)
{
  int i,j;    /*定义整型*/
  double *buffer;  /*浮点指针*/
  file *fp;/*定义一个文件指针*/ 
  fp=fopen(name,"wb "); /*打开当前目录名为name的文件读写*/
  buffer=(double*)malloc((n1 1)*(n2 1)*sizeof(double));/*分配内存空间*/
  for (i=0;i<=n1;i  )
    { for (j=0;j<=n2;j  )
      buffer[i*(n2 1)]=w[i][j]; /*对阵列进行赋值*/
    }
  fwrite((char*)buffer,sizeof(double),(n1 1)*(n2 1),fp);/*将(n1 1)*(n2 1)阵列写入文件中*/ 
  fclose;
  free(buffer);
}
上面程序意为:把一个数组(n1 1)*(n2 1)以二进制方式写入文件name中
请前辈帮我指出我自己改编delphi(原帖)上的错误,多谢    delphi:
 type 
   D2Array=array of array of double;    procedure TForm1.weight(w:D2Array; n1,n2:integer;FileName:pchar);
var 
  i,j:integer;
  FileStream : TFileStream;
begin
   setlength(w,n1 1,n2 1);
   for i:=0 to n1 do
     for j:=0 to n2 do
       w[i,j]:=i*(n2 1);
  FileStream :=TFileStream.Create(FileName,fmCreate );
  FileStream.Write(w,Sizeof(w));
  FileStream.Free ;    
end;   
转为delphi对不对,还得请其他大大参详,小弟实在才学疏浅,供参考看看
    < face="Verdana, Arial, Helvetica">    ——行径窄处,留一步与人行——    發表人 - deity 於 2004/10/19  10:12:24
        
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-19 10:16:06 IP:218.64.xxx.xxx 未訂閱
多谢deity,你真的很厉害!! 1.请问*name,需要用动态数组的形式吗? 2.   type     D2Array=array of array of double;    procedure weight(w:D2Array; n1,n2:integer); var    i,j:integer; begin    setlength(w,n1+1,n2+1);    for i:=0 to n1 do      for j:=0 to n2 do             w[i,j]:=i*(n2+1);//我觉的不是这样的,buffer[i*(n2 1)]=w[i][j];,应该给buffer赋值,buffer[0]:=w[0,1],buffer[1]:=w[0,2] end; 麻烦你再指导一下我
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-19 10:26:53 IP:218.15.xxx.xxx 未訂閱
引言: 多谢deity,你真的很厉害!!我也是刚刚才找资料的> >按上面的意思,> >//我觉的不是这样的,><>您这样的赋值应该是 > >< face="Verdana, Arial, Helvetica"> ——行径窄处,留一步与人行——
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-19 10:50:02 IP:218.64.xxx.xxx 未訂閱
我觉得还是不对,从整个C语言程序来看,权值w应该是已知的 void weight(double **w,int n1,int n2,char *name)其实现的的是将已知的w保存到name文件中 { int i,j; /*定义整型*/ double *buffer; /*浮点指针*/ file *fp;/*定义一个文件指针*/ fp=fopen(name,"wb "); /*打开当前目录名为name的文件读写*/ buffer=(double*)malloc((n1 1)*(n2 1)*sizeof(double));/*分配内存空间*/ for (i=0;i<=n1;i ) { for (j=0;j<=n2;j ) buffer[i*(n2 1)]=w[i][j]; /*对阵列进行赋值*/ } fwrite((char*)buffer,sizeof(double),(n1 1)*(n2 1),fp);/*将(n1 1)*(n2 1)阵列写入文件中*/ fclose; free(buffer); }
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-19 11:03:22 IP:218.64.xxx.xxx 未訂閱
这个void weight(double **w,int n1,int n2,char *name)实现的应该是将二维权值w转化成一维的buffer,然后存到name文件里吧!! 帮我看看是不是这样的?
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-19 17:44:03 IP:202.145.xxx.xxx 未訂閱
小丫123 看你的code 真的是很累< > 也提醒妳了,幫妳做縮排了好多次 最後一次提醒,請自行修改將妳所發問的程式碼部份做縮排 否則將把所有程式碼未縮排的文章全部刪除,敬請配合< >
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-19 18:46:44 IP:220.135.xxx.xxx 未訂閱
我剛剛在研究你發問的另一個問題, 想不到我研究出來後, 那篇文章卻不見了
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
Type       D1Array = Array of Integer;
   D2Array = Array of Array of Integer;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure Weight(w: D2Array; n1, n2: integer; name: String);
  public
    { Public declarations }
  end;    var
  Form1: TForm1;
  Person: TPerson; 
  Computer: TComputer;       Stream: TFileStream;    implementation    {$R *.dfm}    procedure TForm1.Weight(w: D2Array; n1, n2: integer; name: String);
var
   i,j:integer;
   buffer:D1Array;
   FileStream:TFileStream;
begin
   setlength(buffer,(n1 1)*(n2 1));
   setlength(w,n1 1,n2 1);
   for i:=0 to n1 do begin
      for j:=0 to n2 do
         buffer[i*(n2 1) j]:=w[i,j];
   end;
   fileStream:=TFileStream.Create(name, fmCreate);
   FileStream.Write(Pointer(buffer)^,sizeof(Integer)*(n1 1)*(n2 1));
   fileStream.Free;
end;    procedure TForm1.Button1Click(Sender: TObject);
var
   i,j:integer;
   A:D2Array;
   fileName:string;
begin
  fileName:='f:\study.txt';
  setlength(A,3,5);
  for i:=0 to 2 do
     for j:=0 to 4 do
        A[i,j]:=i*5 j;
  Weight(A, 3, 5,fileName );
end;        end.
我不是高手, 高手是正在銀幕前微笑的人. 發表人 - miles 於 2004/10/19 18:50:40
------


我不是高手, 高手是正在銀幕前微笑的人.
小丫123
初階會員


發表:85
回覆:62
積分:29
註冊:2004-08-31

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-10-19 21:00:21 IP:218.64.xxx.xxx 未訂閱
多谢Miles! 我试了你的方法,可是出来的还是乱码?怎么回事呢?
Miles
尊榮會員


發表:27
回覆:662
積分:622
註冊:2002-07-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-10-19 21:50:02 IP:220.135.xxx.xxx 未訂閱
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
Type       D1Array = Array of Char;
   D2Array = Array of Array of Integer;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    procedure Weight(w: D2Array; n1, n2: integer; name: String);
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.Weight(w: D2Array; n1, n2: integer; name: String);
var
   i,j:integer;
   buffer:D1Array;
   FileStream:TFileStream;
begin
   setlength(buffer,(n1 1)*(n2 1));
   setlength(w,n1 1,n2 1);
   for i:=0 to n1 do begin
      for j:=0 to n2 do
         buffer[i*(n2 1) j]:= IntToStr(w[i,j])[1];
   end;
   fileStream:=TFileStream.Create(name, fmCreate);
   FileStream.Write(Pointer(buffer)^,(n1 1)*(n2 1));
   fileStream.Free;
end;    procedure TForm1.Button1Click(Sender: TObject);
var
   i,j:integer;
   A:D2Array;
   fileName:string;
begin
  fileName:='c:\study.txt';
  setlength(A,3,5);
  for i:=0 to 2 do
     for j:=0 to 4 do
        A[i,j]:=i*5 j;
  Weight(A, 3, 5,fileName );
end;        procedure TForm1.Button2Click(Sender: TObject);
var
MinutiaeData1, MinutiaeData2 : oleVariant;
begin
  MinutiaeData1 := Integer(AllocMem(Button2.LRDockWidth));
end;    end.
我不是高手, 高手是正在銀幕前微笑的人.
------


我不是高手, 高手是正在銀幕前微笑的人.
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-10-19 22:08:41 IP:219.129.xxx.xxx 未訂閱
小丫123您好:   纠正上面所说,是如您所说,将一个两维数组,转为一维,然后保存至文件中,小弟如无谬误请指正,下面改成delphi,试试看:
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
   D2Array=array of array of integer;
type
   buffer=array of integer;
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure weight(w:D2Array; n1,n2:integer;FileName:pchar);
  end;    var
  Form1: TForm1;
  buf:buffer;
implementation    {$R *.dfm}
//调用函数weight
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
  w1:D2Array;
begin
   setlength(w1,3,2);
   for i:=0 to 2 do
     for j:=0 to 1 do
      w1[i,j]:=i j;
   weight(w1,2,1,pchar('e:\test.txt'));
end;
//定义函数weight
procedure TForm1.weight(w:D2Array; n1,n2:integer;FileName:pchar);
var
  i,j:integer;
  FileStream : TFileStream;
begin
   setlength(buf,(n1 1)*(n2 1));
   for i:=0 to n1 do
     for j:=0 to n2 do
       buf[i*(n2 1) j]:=w[i,j];
  FileStream :=TFileStream.Create(FileName,fmCreate);
  FileStream.Write(buf,Sizeof(buf));
  FileStream.Free ;
end;
//读取文件中的值
procedure TForm1.Button2Click(Sender: TObject);
var
  FileStream:TFileStream;
  i:integer;
begin
  memo1.Lines.Clear;
  FileStream :=TFileStream.Create('e:\test.txt',fmopenread);
  FileStream.Read(buf,Sizeof(buf));
  for i:=0 to high(buf) do
    memo1.Lines.Add(inttostr(buf[i]));
  FileStream.Free ;
end;
end. 
采取什么的方式进行保存,也就采取什么方式进行读取
——行径窄处,留一步与人行——
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-10-19 22:28:37 IP:219.129.xxx.xxx 未訂閱
小丫123您好:   您的意思是否是打开文档,可以看到您所保存的一维数组的值,参考下列:
type
   D2Array=array of array of integer;
type
   buffer=array of integer;
//调用函数weight
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
  w1:D2Array;
begin
   setlength(w1,3,2);
   for i:=0 to 2 do
     for j:=0 to 1 do
      w1[i,j]:=i j;
   weight(w1,2,1,pchar('e:\test.txt'));
end;
//定义函数weight
procedure TForm1.weight(w:D2Array; n1,n2:integer;FileName:pchar);
var
  i,j:integer;
  s:TStringList;
begin
   s:=TStringList.Create;
   setlength(buf,(n1 1)*(n2 1));
   for i:=0 to n1 do
     for j:=0 to n2 do
       begin
         buf[i*(n2 1) j]:=w[i,j];
         s.Add(inttostr(buf[i*(n2 1) j]));
       end;
    s.SaveToFile(filename);
end;
望能早日解决
——行径窄处,留一步与人行——
系統時間:2024-07-06 13:43:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!