2011-02-10 159 views
0

所以基本上我有一个看起来像这样坏数字格式

modulis = record 
     kodas : string[4]; 
     pavadinimas : string[30]; 
     skaicius : integer; 
     kiti : array[1..50] of string; 
    end; 

的记录,我试图从文本文件中像这样阅读:

ReadLn(f1,N); 

for i := 1 to N do 
    begin 
     Read(f1,moduliai[i].kodas); 
     Read(f1,moduliai[i].pavadinimas); 
     Read(f1,moduliai[i].skaicius); 
     for j := 1 to moduliai[i].skaicius do 
      Read(f1,moduliai[i].kiti[j]); 
     ReadLn(f1); 
    end; 

和文件看起来像这个:

9 
IF01 Programavimo ivadas 0 
IF02 Diskrecioji matematika 1 IF01 
IF03 Duomenu strukturos 2 IF01 IF02 
IF04 Skaitmenine logika 0 
IF05 Matematine logika  1 IF04 
IF06 Operaciju optimizavimas 1 IF05 
IF07 Algoritmu analize  2 IF03 IF06 
IF08 Asemblerio kalba  1 IF03 
IF09 Operacines sistemos 2 IF07 IF08 

而我得到106坏数字格式。无法弄清楚如何解决这个问题,我不确定,但我认为它与文本文件有关,但是我从互联网复制了文本文件,所以它必须是好的:

+0

'KITI' 是 '字串' 或 '字符串[5]'? – 2011-02-10 20:31:23

回答

1

读取字符串数据是从在帕斯卡读取数字数据不同。

使用数字Read指令消耗数据,直到它达到空白或文件的结尾。现在,在这种情况下,空白字符可以是空格字符,制表符,EOL“字符”。所以如果在一行文本中有两个数字,你可以使用两个连续的Read s逐一读取它们。

我相信你已经知道了。

我相信你认为它可以和字符串一样工作。但它不会,你不能简单地通过使用两个连续的Read指令来从一行文本中读取两个字符串值。 Read会消耗所有文本直到EOL或EOF。读取字符串变量后,可以容纳很多字符,剩下的数据被遗忘。在这方面它基本上相当于ReadLn

解决方案?将输入文件中的所有数据排列在不同的行上,并更好地使用ReadLn s而不是所有的Read s。 (但我认为后者可能是不必要的,重新排列输入数据可能就足够了。)

或者,您需要将整行文本读入临时字符串变量,然后手动分割并将部分分配给相应的记录字段,而不会忘记将数值从string转换为integer

你选择最适合你的是什么。

0

我不是Pascal程序员,但它看起来像文本文件中的字段不是固定长度。您如何期望您的程序在回读期间划定每个字段?

1

因为您声明pavadinimas为字符串[30],无论字符串的长度是多少,它都会读取30个字符。例如,在下面的行pavadinimas将 “Skaitmenine LOGIKA 0”而不是只“Skaitmenine LOGIKA”

IF04 Skaitmenine logika 0