LoginSignup
0

More than 1 year has passed since last update.

<9> ファイル型 (標準 Pascal 範囲内での Delphi 入門)〔裏〕

Last updated at Posted at 2021-02-16

9. ファイル型 (File Types)

9.1. ファイル構造

・外部ファイルとの関連付け (標準 Pascal の場合)

標準 Pascal では program ヘッダのパラメータと外部ファイルとの関連付けは処理系定義となっています。つまり、規格では定められていません。

・外部ファイルとの関連付け (Pascal-P5 の場合)

Pascal-P5 では、2 つの特殊なテキストファイルが扱えます。

外部ファイル 説明
prd 読み込み専用の外部ファイル
prr 書き込み専用の外部ファイル

詳しくは次の記事を参考にしてください。

・外部ファイルとの関連付け (UCSD Pascal の場合)

UCSD Pascal などでは Reset() や Rewrite() の第 2 引数にファイル名を渡せるようにして問題を解決しています。

RANDOMACCESS.pas
PROGRAM RANDOMACCESS;
VAR
  DISK: FILE OF 
          RECORD
            NAME: STRING[20];
            DAY, MONTH, YEAR: INTEGER
          END;
BEGIN
  RESET(DISK, 'RECORDS.DATA');
  WHILE NOT EOF(INPUT) DO
  BEGIN
    ...

・外部ファイルとの関連付け (拡張 Pascal の場合)

拡張 Pascal では Bind() / Binding() / Unbind() とレコード型 BindingType を使って問題を解決しています。

procedure bindfile(var f : text);
var
  b : BindingType;
begin
  unbind(f);
  b := binding(f);
  repeat
    writeln('Enter file name:');
    readln(b.name);
    bind(f, b);
    b := binding(f);
    if not b.bound then
      writeln('File not bound--try again.');
  until b.bound;
end;

See also:

9.2. テキストファイル

・Eoln 状態の文字は?

Eoln() が True の状態で Read() によって 1 文字読み込んだ時、標準 Pascal は空白を返します。Delphi は改行コードを返します。

See also:

・Write と Writeln

標準 Pascal でテキストファイルに出力する際、Writeln() ではなく Write() で終わった場合、不完全な行とみなされ、行末が自動で追加されます。

(13.) テキストファイルでの Write と Writeln - Delphi と標準 Pascal の比較 (標準 Pascal コードを Delphi に移植する際の注意点) (Qiita)

(9.2.1.) バッファ変数の代替

テキストファイルの操作に限定されますが、次の関数でバッファ変数の代替が可能です。

  function CurrentChar(var F: Text): AnsiChar;
  begin
    Eoln(F);
    Result := (TTextRec(F).BufPtr + TTextRec(F).BufPos)^;
  end;

関数 CurrentChar() を使って F^ を置き換えられます。

var
  F: Text;
  ch: Char;
begin
  ...

  ch := F^;
  ch := CurrentChar(F);

  ...
end.

CurrentChar() 関数内の一見無意味に思える Eoln() は、ファイルバッファを更新する役割があります。タイミングによっては BufPosBufSize と同じになってしまう (ポインタがファイルバッファの終端を超える) 事があるからです。

(9.2.2.) ファイルの追記

(9.3.) 型なしファイル

・型なしファイルの由来

Delphi には型なしファイル型というものがあります。いわゆるバイナリファイルを扱うファイル型です。

この拡張は UCSD Pascal 由来のようです。BlockRead() や BlockWrite() も用意されていました。

See also:

索引

:ramen: [ ← 8. 集合型〔裏〕 ] [ ↑ 目次へ ] [ → 10. ポインタ型〔裏〕 ]

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0