超初心者です。
たとえば、下のようなコードの書き方の場合に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;
>どこが悪いのでしょうか?
まず、「超初心者」という名前が悪い。
次に、コードを手入力したのが悪い。
最後に、レコードサイズを指定しないのが悪い。
それはね...様。
あるソールをそのまま利用してプログラムを組んでいます。
ご指定のこと反省しています。
>最後に、レコードサイズを指定しないのが悪い。
実際にはどのように指定するのでしょうか?
レコードサイズのデフォルトは128。
これは、昔のランダムファイルの名残かな...
「ナゴリ」って、余波じゃないよね。
閑話休題。
Rewite(F,1);
ほったたらかし ⇒ ほったらかし
読み人知らず ⇒ 詠み人知らず
Rewite ⇒ Rewrite
30点の「原典」 、もとい 「減点」。 ←減点10
そもそも、「不完全な一部のサンプルコード」だけを示して、しかも
「何がうまくいかないのか」も書かずに「どこが悪いのでしょうか?」と
質問されても、... ん?だから「質問の超初心者」?
回答も「当たるも八卦、当たらぬも八卦」と占い並にならざるを得ないよね。
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;
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;
出来るだけオリジナルに忠実に書くと
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が宣言されてないし、初期化されてない。
グローバル変数で他で宣言しているならその部分が間違っているのでは?
ツイート | ![]() |