【问题标题】:Read/Write to file on old IBM PS/2 in turbo pascal 5.5在 turbo pascal 5.5 中读取/写入旧 IBM PS/2 上的文件
【发布时间】:2016-01-29 03:33:08
【问题描述】:

问题:我最近购买了一台 1989 年的 IBM PS2,我正在尝试通过软盘将大型文件从基于 UNIX 的新机器移动到这台 IBM。我有一个 bash 脚本,可以将我的文件分成 ~2MB 块,现在我正在尝试编写一个 pascal 程序来在这些文件被传输后重建它们。

我无法在这台计算机上找到正确的文件读/写方法。我尝试过各种 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 作为我的命令行 pascal 编辑器。 (自述文件最后一次更新是在 1989 年)
  • 它已安装 Turbo 调试器 1.5。

再一次,我知道这是一个晦涩难懂的问题,所以提前感谢您能给我的任何帮助!

【问题讨论】:

  • 这个问题并没有那么晦涩难懂。基本 Pascal 文件 I/O 已经很长时间没有改变了。你只是把它当作一个练习吗?你知道 DOS COPY 可以连接文件,甚至是使用 /B 选项的二进制文件。 例如COPY File1/B + File2/B File3。但如果你想在 Pascal 中执行此操作,你是否查找过 file handling in Pascal
  • @lurker 感谢COPY 的知识,我实际上并不知道,我会试一试(我是 linux 人)!但我已经阅读了该页面,它是问题中的第一个链接。我将更改链接标题,使其更明显,谢谢。
  • 如果您在整个过程中保持输出文件打开,我认为您不需要append 来连接文件。您最初只需要rewrite 来打开新的输出文件进行写入。在您编译的第二个示例中,您为什么不使用链接到页面中描述的writeln(outFile, ...)?即使是最古老的 Pascal 编译器也应该可以工作(可以追溯到 Niklaus Wirth 1974)。您的第二个示例如何使用 close 编译但您的第一个示例找不到 close
  • 你为什么要导入unit win?这只会造成麻烦,因为我假设你没有使用一些 win3.x
  • 我做了一些研究,append 函数应该至少可以追溯到 Turbo Pascal 3.0。所以当你说appendclose 找不到时,还有其他问题。编译器支持它们。

标签: pascal dos turbo-pascal


【解决方案1】:

我的 Pascal 记忆力非常生疏……但正如其他人所指出的,您应该考虑以下几点:

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 总是会在字符串/行的末尾添加一个返回,另一方面,读和写会将光标留在任何地方,而不会跳转到新行。

【讨论】:

  • (1) assignfile 是 delphi,不是 TP。 (2) 使用“text”作为文本 I/O 的文件类型。 (3) 关闭 outfile 也不错。 (4) pascal 是在使用前声明的,所以最好声明“s”。无论如何,OP 可能想要一个块读/写解决方案
【解决方案2】:

这里有一些旧的 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} 的东西。)

【讨论】:

  • closefile+Assignfile 只是 delphi,但用 assign 和 close 替换它应该可以工作。 blockwrite 和 read 的最后一个参数将是整数或字(它们是 16 位),而不是 32 位 longint,因为您不能使用常规方法(getmem 等)在 TP 中使用大于 16 位的块使用缓冲区的静态数组将使代码更简单。
  • 和 iirc freemem 需要 TP 中的大小。
  • @Marco:好点。除了我确实说过我发布的 Delphi 代码可以让海报开始。我没有发布 TP 代码,因为我没有一个 TP 编译器来首先对其进行测试。 :-)
  • 所以现在你可以更正它,使它成为TP代码:-)
  • 当我声明 pBuff 时,我收到错误 PChar Error 3: Unknown identifier :'(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多