6

質問: 私は最近、1989 年の IBM PS2 を入手しました。フロッピーを介して、新しい UNIX ベースのマシンからこの IBM に大きなファイルを移動しようとしています。ファイルを ~2MB のチャンクに分割する bash スクリプトがあります。転送後にこれらのファイルを再構築するためのパスカル プログラムを作成しようとしています。

このコンピュータでファイルへの正しい読み取り/書き込み方法が見つかりません。さまざまな Pascal チュートリアル サイトを試しましたが、それらはすべて新しいバージョン用です ( File Handling In Pascalでフォローしたサイト)。空のファイルを作成することはできますが (以下で説明します)、書き込むことができません。このタイプのコンピューターの正しいパスカル読み取りおよび書き込み方法を知っている人はいますか?

これはあいまいな質問であることはわかっています。

詳細:

ファイルを正しく作成する現在のテスト コードは次のとおりです。

program testingFiles;
uses Crt, Win;

const FILE_NAME = 'testFile.txt';
var outFile : File;

begin
writeln('creating file ...');
Assign(outFile, FILE_NAME);
rewrite(outFile);    

end.

これは、機能しないテスト コードです。メソッドのappend()close()が見つかりませんでした:

program testingFiles;
uses Crt, Win;

const FILE_NAME = 'testFile.txt';
var outFile : File;

begin
writeln('creating file ...');
Assign(outFile, FILE_NAME);

append(outFile);
writeln('this should be in the file');
close(outFile);

end.

これも機能しない代替手段であり、このwriteln()方法は端末にのみ出力されます。しかし、それ以外の場合、これはコンパイルされます。

program testingFiles;
uses Crt, Win;

const FILE_NAME = 'testFile.txt';
var outFile : File;

begin
writeln('creating file ...');
Assign(outFile, FILE_NAME);

rewrite(outFile);
writeln('this should be in the file');
close(outFile);

end.

システム: 前述のとおり、これは 1989 年のIBM PS2です。

  • Windows 3.0 がインストールされており、DOS および MS-DOS 端末も実行できます。
  • Microsoft SMARTDrive ディスク キャッシュ バージョン 3.06 があります。
  • Turbo Pascal 5.5 がインストールされてturboおり、コマンド ライン パスカル エディターとして使用しています。(readme の最終更新は 1989 年です)
  • Turbo デバッガー 1.5 がインストールされています。

繰り返しますが、これはあいまいな質問であることは承知しています。

4

2 に答える 2

2

私のパスカルの記憶は非常にさびています... しかし、他の人が指摘したように、ここにあなたが考慮すべきことがあります:

program testingFiles;
uses Crt, System;
//No need of importin Win Win is for Windows enviorment, however I'm not sure if you need to use System, Sysutils or was there a Dos class???

const FILE_NAME = 'testFile.txt';
var outFile,inFile : File;

begin
writeln('creating file ...');
Assign(outFile, FILE_NAME);
rewrite(outFile);

//Now Open the first chunk of the file you want to concatenate

AssignFile(inFile, "fisrt_chunk.dat");
reset(inFile);

while not eof(inFile) do
 begin
   readln(inFile, s);
   writeln(outFile,s);
 end;
close(inFile);

end.

Turbo/Borland Pascal をインストールしていないので、自分でコンパイルすることはできませんでした。動作するという保証はありません。アイデアのようなものです。

  • 覚えておくべき重要なことは、readln と writeln は常に文字列/行の最後に改行を追加することです。一方、read と write は新しい行にジャンプせずにカーソルをどこにでも残します。
于 2016-02-17T22:30:21.680 に答える
1

これは、ファイルのコピーの要点を提供する、少なくとも構文互換性に近いはずの古い Delphi コードです (エラー チェックとエラーの場合のリソース処理が制限されています。これは演習として残します)。バイナリ コンテンツとテキスト コンテンツの両方をコピーできます。

program Project2;

uses
  SysUtils;

var
  NumRead, NumWritten: LongInt;
  pBuff : PChar;
  SrcFile, DstFile: File;
const
  BuffSize = 2048;  // 2K buffer. Remember not much RAM available    

  InFileName = 'somefile.txt';
  OutFileName = 'newfile.txt';
begin
  NumRead := 0;
  NumWritten := 0;

  AssignFile(SrcFile, InFileName);
  AssignFile(DstFile, OutFileName);

  // Allocate memory for the buffer
  GetMem(pBuff, BuffSize);

  FileMode := 0;            // Make input read-only
  Reset( SrcFile, 1 );

  FileMode := 2;            // Output file read/write
  Rewrite( DstFile, 1 );

  repeat
    // Read a buffer full from input
    BlockRead(SrcFile, pBuff^, BuffSize, NumRead);

    // Write it to output
    BlockWrite(DstFile, pBuff^, NumRead, NumWritten);
  until (NumRead = 0) or (NumWritten <> NumRead);

  // Cleanup stuff. Should be protected in a try..finally,
  // of course.
  CloseFile(SrcFile);
  CloseFile(DstFile);
  FreeMem(pBuff);
end.

上記のコードは現在、Delphi 2007 (私がインストールした最も古いバージョン) でコンパイルされます。(以下の注を参照してください。)

補足として、これは私が持っていたコードのアーカイブ バージョンからのもので、16 ビット Delphi 1 用にコンパイルされ、90 年代半ばから後半に 32 ビット Delphi 2 でもコンパイルできるように拡張されました。古いタグ付きブランチのソースリポジトリにまだぶら下がっています。剪定をする必要があると思います。:-) 他の機能を削除するためにクリーンアップし、{$IFDEF WIN32} ... {$ELSE} ... {$ENDIF}投稿する前に多くのものを削除しました。)

于 2016-01-29T23:44:37.220 に答える