BlockWriteで文字列(配列)を保存するには?


超初心者  2006-10-10 12:09:47  No: 23529  IP: 192.*.*.*

超初心者です。
たとえば、下のようなコードの書き方の場合にBlockWriteでファイルに保存すると、うまく保存できません。どこが悪いのでしょうか?
アドバイスお願いします。

procedure GetChars(var C1:array of Char; C2:string):integer ;
var
   i,j:integer;
begin
   j:=Length(C2));
   for i:=0 to (j-1) do begin
      C1[i]:=C2[i+1];
   end;
   result:=j;
end;

procedure ToFile;
var
    str:array[0..2]of string;
    Buff:allay[0..255]of Char;
    i,j:integer;
begin
    str[0]:='123';
    str[1]:='あいう';
    str[2]:='あaいb';

       for i:=0 to 2 do begin
               j:=GetChars(Buff, str[i]);
               Buff[j]:=#0 ;
               BlockWrite(F, Buff, (j+1));
       end;
end;

編集 削除
それはね...  2006-10-10 13:07:21  No: 23530  IP: 192.*.*.*

>どこが悪いのでしょうか?
まず、「超初心者」という名前が悪い。
次に、コードを手入力したのが悪い。
最後に、レコードサイズを指定しないのが悪い。

編集 削除
超初心者  2006-10-10 14:16:50  No: 23531  IP: 192.*.*.*

それはね...様。
あるソールをそのまま利用してプログラムを組んでいます。
ご指定のこと反省しています。
>最後に、レコードサイズを指定しないのが悪い。
実際にはどのように指定するのでしょうか?

編集 削除
ヘルプさん、ほったたらかしでお気の毒(読  2006-10-10 15:03:11  No: 23532  IP: 192.*.*.*

レコードサイズのデフォルトは128。
これは、昔のランダムファイルの名残かな...
「ナゴリ」って、余波じゃないよね。
閑話休題。
Rewite(F,1);

編集 削除
添削  2006-10-10 15:09:12  No: 23533  IP: 192.*.*.*

ほったたらかし ⇒ ほったらかし
読み人知らず ⇒ 詠み人知らず
Rewite ⇒ Rewrite

30点の「原典」 、もとい 「減点」。 ←減点10

編集 削除
うらない  2006-10-11 00:36:17  No: 23534  IP: 192.*.*.*

そもそも、「不完全な一部のサンプルコード」だけを示して、しかも
「何がうまくいかないのか」も書かずに「どこが悪いのでしょうか?」と
質問されても、... ん?だから「質問の超初心者」?
回答も「当たるも八卦、当たらぬも八卦」と占い並にならざるを得ないよね。

編集 削除
TS  2006-10-11 17:44:27  No: 23535  IP: 192.*.*.*

BlockWrite最近使った事がなかったので確認の為作ってみました
本当は最後にまとめて書き込むんでしょうが手抜きです。
procedure ToFile;
var
  F:File of char;
  str:array[0..2]of string;
  i,j:integer;
  Buff:Char;
begin
  str[0]:='123';
  str[1]:='あいう';
  str[2]:='あaいb';
  AssignFile(F,'F:\test01');
  rewrite(F);
  for i:=0 to 2 do
    begin
      for j:=1 to length(str[i]) do
        begin
          BlockWrite(F,str[i][j],1);
        end;
    end;
  closeFile(F);
end;

編集 削除
TS  2006-10-12 09:35:58  No: 23536  IP: 192.*.*.*

procedure Test2;
var
  F:File;
  str:array[0..2]of string;
  i,j,n:integer;
  Buff:array of Char;
begin
  str[0]:='123';
  str[1]:='あいう';
  str[2]:='あaいb';
  AssignFile(F,'F:\test03');
  rewrite(F,1);
  Buff:=nil;
  n:=0;
  for i:=0 to 2 do
    begin
      for j:=1 to length(str[i]) do
        begin
          setlength(buff,n+1);
          Buff[n]:=str[i][j];
          inc(n);
        end;
    end;
  BlockWrite(F,PChar(Buff)^,n);
  closeFile(F);
end;

編集 削除
通りすがり  2006-10-12 13:57:03  No: 23537  IP: 192.*.*.*

出来るだけオリジナルに忠実に書くと

procedure ToFile;
var
    F:File;  //宣言し忘れ?グローバル変数?
    str:array[0..2]of string;
    Buff:array[0..255]of Char; //タイプミス
    i,j:integer;
begin
    str[0]:='123';
    str[1]:='あいう';
    str[2]:='あaいb';

    AssignFile(F,'c:\temp\test.dat');  //ファイルを指定(ファイル名は適当)
    Rewrite(F,1);  // ファイルを作成

    for i:=0 to 2 do begin
        j:=GetChars(Buff, str[i]);
        Buff[j]:=#0 ;
        BlockWrite(F, Buff, (j+1));
    end;
    CloseFile(F); //ファイルを閉じる
end;

>BlockWrite(F, Buff, (j+1));
この部分のFが宣言されてないし、初期化されてない。
グローバル変数で他で宣言しているならその部分が間違っているのでは?

編集 削除