所以基本上我有一个看起来像这样的记录
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 :(得分: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程序员,但看起来文本文件中的字段不是固定长度。在回读过程中,您希望程序如何划分每个字段?