Pascal ReadLn多种var类型

时间:2011-11-24 00:25:36

标签: variables types pascal readline

我的问题看起来像这样。 我的每行都有一个数据(输入)“文本文本编号”的文件我需要使用ReadLn(myfile,string,string2,real1(或double),real2(或double));来获取数据,正如你在下面提供的代码中看到的那样,但是当我使用函数我这样做时刚刚描述,我收到错误我需要单独变量中的每个数据。我需要处理数字(乘法,求和),我需要输出(结果)文件的名称和姓氏,其中数据看起来像这样“名字姓氏1(来自输入文件)乘以number2(来自输入文件)”输入文件和最后一行中的每一行将是“Total:sum(all lines(number1 * number2))”。 我需要帮助的唯一问题是将每个行数据从初始文件读取到单独的变量。

文件说明:

  • 名称姓氏NumericValue( double 类型)NumericValue( double 类型)

    例如: Somedude Hissurname 86.5 9.85

尝试读取这样的行数据时总是出错:

  • ReadLn(filevar(:text),name(:string [25]的数组),姓氏(:数组) string [25]),numeric1(: real ),numeric2(: real ));

    例如: ReadLn(数据,名称[],sur [],米,价格);

当我尝试相同的事情,但在将数值更改为整数(在文件中)之后:

文件中的更改:

  • 名称姓氏NumericValue( 整数 类型)NumericValue( 整数 类型)

    E.g。 Somedude Hissurname 86 9

程序代码如下所示:

  • ReadLn(filevar(:text),name(:string [25]的数组),姓氏(:数组) string [25]),numeric1(: 整数 ),numeric2(: 整数 ));

    例如: ReadLn(数据,名称[],sur [],米,价格);

程序几乎按预期工作(numeric1取两个数值,第二个留空)。

E.g.: name[] = Somedude, sur[] = Hissurname, numeric1 = 86 9, numeric2 = 0

这是我的代码有多远:

program test;
type    mas = array[1..30] of real;
        mas1 = array[1..30] of string[25];

var name,sur:mas1;
    atl:mas;
    meters,price,total:integer;
    i,p,n       :integer;
    data      :text;
begin
    Assign(data, 'somefile.txt');
    Reset(data);
    ReadLn(data,n);
    for i:=1 to n do
        begin
                  ReadLn(data, name[i], sur[i], meters, price);
                  WriteLn(name[i],meters, price);
        end;
    Close(data);
    ReadLn;
end.

提前谢谢你。我之前做过类似的帖子,但解决方案不符合学校的需求(对他们来说太复杂了.-)我需要使用简单的ReadLn方法,其中包含4个变量(或者2或3,如果我错了)。无论如何,原谅我两次发布同样的问题。

P.S。原谅我格式化,拼写和想法问题。我很困。我希望这次我能说清楚。

1 个答案:

答案 0 :(得分:1)

(由于Ken在对问题的评论中说明的原因,回答了第一段)

根据standard你应该能够做到这一点。 ReadLn过程可以采用可变数量的参数(只有在能够将值读入这些参数时才有意义。)

我可以测试两个pascal编译器,这行

ReadLn(f, s1, s2, r1, r2);

编译正确(其中'f'是TextFile,'s1'和's2'是string s,'r1'和'r2'是Real s)。

让它工作有点困难。如果您提供以下输入(取自previous question),

  

Brat Sunbather 5.66 55.4

Delphi将因'无效数字输入(EInOutError)'而失败,并且FPC将因'无效输入(EInOutError)'而失败。问题在于我们想要读入的字符串变量。我们提供的整行实际上是一个字符串(一个空格是字符串中一个完全有效的字符),所以当代码看到一个字符串作为要读入的第一个变量时,它会读取整行到它。

因此,解决方案是提供一个标记字符串结尾的特殊字符。 Ctrl + Z(ASC dec:26 hex:1A)适用于Delphi(我不知道FPC或其他编译器会起什么作用(如果有的话))。所以特制的文本文件(对于Delphi)就像:

2
Brat Sunbather 5.66 55.4
    ↑         ↑    ↑    ↑
   ^Z        ^Z space  eol
Bart Simpson 55.7 45.4 
    ↑       ↑    ↑    ↑
   ^Z      ^Z space  eol


修改 如果您无法控制输入文件的生成方式,并且您确定“空格”是字符串变量的分隔符,则可以在循环中逐字符地读取字符串变量,直到您读取空格为止。一个例子可以是这样的:

procedure TForm1.Button1Click(Sender: TObject);
var
  f: TextFile;
  fn: string;

  Lines: Integer;
  i: Integer;
  first, last: string;
  R1, R2, Total: Real;

  function ReadName: string;
  var
    c: Char;
  begin
    Result := '';
    repeat
      Read(f, c);
      Result := Result + c;
    until c = ' ';
  end;

begin
  fn := 'data.txt';
  AssignFile(f, fn);
  Reset(f);
  Read(f, Lines);
  Readln(f);
  Total := 0;
  for i := 1 to Lines do begin
    first := ReadName;
    last := ReadName;
    Read(f, R1, R2);

// do whatever necessary with names & numbers
//    showmessage(first + ' ' + last + ' - ' + FloatToStr(R1 * R2));

    Total := Total + R1 * R2;
    Readln(f);
  end;
// do whatever necessary with Total
//  ShowMessage(FloatToStr(Total));

  CloseFile(f);
end;