两个程序之间使用文件通信

时间:2011-05-06 15:59:43

标签: file-io pascal

我想用Pascal编写的两个独立程序使用附加文本文件在它们之间进行通信。它适用于前2-3条消息,但随后它会在sender.pas或receiver.pas中发出运行时错误你知道我的错误在哪里或你有什么建议吗?

第一个程序receiver.pas

var
 f : text;
 s : string;
begin
 {I-}
 Assign(f,'main.in');
 while true do
  begin

   reset(f);
   while IOResult<>0 do      //
    begin                    // Wait until the file
     close(f);               //       is closed by sender
     reset(f);               //
    end;                     //

   if eof(f) then
    close(f)
   else
    begin
     readln(f,s);
     close(f);
     rewrite(f);
     close(f);
     writeln(s);
    end;
  end;
 {I+}
end.

第二个程序sender.pas

var
 f : text;
 s : string;
begin
 {I-}
 Assign(f,'main.in');
 while true do
  begin
   readln(s);

   rewrite(f);                //
   while IOResult<>0 do       //
    begin                     // Wait until the file
     close(f);                //        is closed by receiver
     rewrite(f);              //
    end;                      //

   writeln(f,s);
   close(f);
  end;
 {I+}
end.

2 个答案:

答案 0 :(得分:2)

我注意到的一些事情:

  1. 如果重写失败,afaik文件没有打开,你不必关闭它?关闭未打开的文件可能会导致运行时错误(尽管我假设assign会安全地启动它)
  2. 取决于你如何使用它们,可能存在逻辑。即关闭文件后,其他应用程序可以直接打开文件。通常,关闭的文件句柄会持续几个100毫秒,直到几秒钟(取决于文件系统的业务)。这可能导致这种方案中的饥饿问题。 (虽然它可以在普通的dos中工作,但不会延迟,至少不会那么多)
  3. 如果文件不存在,读者将崩溃。
  4. 我认为{I - } / {I +}是一个拼写错误,你的源代码真的是{$ I-}和{$ I +}(注意美元?)
  5. 在Windows pascal版本中,只读访问并不总是锁定。把filemode:= 2作为第一行。
  6. 这是什么编译器? Delphi,免费Pascal?哪个版本?

    我的新(免费Pascal)接收器代码变为:

    uses sysutils;
    var
     f : text;
     s : string;
    begin
     filemode := 2; // read-only
     {$I-}
     Assign(f,'main.in');
     while true do
      begin
       reset(f);
       while IOResult<>0 do      //
        begin                    // Wait until the file
         close(f);               //       is closed by sender
         sleep(1000);
         reset(f);
        end;
       if eof(f) then
        begin
          close(f);
          sleep(1000);
        end
       else
        begin
         readln(f,s);
         close(f);
         rewrite(f);
         close(f);
         writeln(s);
        end;
      end;
     {$I+}
    end.
    

    新的发件人代码是:

    uses sysutils;
    var
     f : text;
     s : string;
    begin
     filemode := 2; // read-only
     {$I-}
     Assign(f,'main.in');
     while true do
      begin
       reset(f);
       while IOResult<>0 do      //
        begin                    // Wait until the file
         close(f);               //       is closed by sender
         sleep(1000);
         reset(f);
        end;
       if eof(f) then
        begin
          close(f);
          sleep(1000);
        end
       else
        begin
         readln(f,s);
         close(f);
         rewrite(f);
         close(f);
         writeln(s);
        end;
      end;
     {$I+}
    end.
    

答案 1 :(得分:1)

一些事情:确保在每次文件操作后检查IOResult,而不仅仅是重写/重置 - 如果你的重置/重写失败,请不要调用close - 你可能想要在那些重试中使用Sleep(250)之类的东西环路。

相关问题