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


超初心者  2006-10-10 21:09:47  No: 23529

超初心者です。
たとえば、下のようなコードの書き方の場合に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 22:07:21  No: 23530

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


超初心者  2006-10-10 23:16:50  No: 23531

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


ヘルプさん、ほったたらかしでお気の毒(読  2006-10-11 00:03:11  No: 23532

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


添削  2006-10-11 00:09:12  No: 23533

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

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


うらない  2006-10-11 09:36:17  No: 23534

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


TS  2006-10-12 02:44:27  No: 23535

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 18:35:58  No: 23536

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 22:57:03  No: 23537

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

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が宣言されてないし、初期化されてない。
グローバル変数で他で宣言しているならその部分が間違っているのでは?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加