数字格式不正确

时间:2011-02-10 20:14:10

标签: data-structures pascal record

所以基本上我有一个看起来像这样的记录

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个错误的数字格式。无法弄清楚如何解决这个问题,我不确定,但我认为它与文本文件有关,但是我从互联网上复制了文本文件所以它必须是好的:|

3 个答案:

答案 0 :(得分:1)

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

IF04    Skaitmenine logika  0

答案 1 :(得分:1)

读取字符串数据与读取Pascal中的数字数据不同。

对于数字,Read指令会消耗数据,直到它到达空格或文件末尾。现在,在这种情况下,空格可以是空格字符,制表符,EOL'字符'。因此,如果一行文本中有两个数字,您可以使用两个连续的Read逐个读取它们。

我相信你已经知道了。

而且我相信你认为它与字符串一样。但它不会,您只能通过使用两个连续的Read指令从一行文本中读取两个字符串值。 Read将使用EOL或EOF之前的所有文本。在读取之后,字符串变量被分配但是它可以容纳许多字符,其余的数据被抛弃​​而被遗忘。在这方面,它基本上相当于ReadLn

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

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

你选择最适合你的东西。

答案 2 :(得分:0)

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