坏数字格式
所以基本上我有一个看起来像这样坏数字格式
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坏数字格式。无法弄清楚如何解决这个问题,我不确定,但我认为它与文本文件有关,但是我从互联网复制了文本文件,所以它必须是好的:
读取字符串数据是从在帕斯卡读取数字数据不同。
使用数字Read
指令消耗数据,直到它达到空白或文件的结尾。现在,在这种情况下,空白字符可以是空格字符,制表符,EOL“字符”。所以如果在一行文本中有两个数字,你可以使用两个连续的Read
s逐一读取它们。
我相信你已经知道了。
我相信你认为它可以和字符串一样工作。但它不会,你不能简单地通过使用两个连续的Read
指令来从一行文本中读取两个字符串值。 Read
会消耗所有文本直到EOL或EOF。读取字符串变量后,可以容纳很多字符,剩下的数据被遗忘。在这方面它基本上相当于ReadLn
。
解决方案?将输入文件中的所有数据排列在不同的行上,并更好地使用ReadLn
s而不是所有的Read
s。 (但我认为后者可能是不必要的,重新排列输入数据可能就足够了。)
或者,您需要将整行文本读入临时字符串变量,然后手动分割并将部分分配给相应的记录字段,而不会忘记将数值从string
转换为integer
。
你选择最适合你的是什么。
我不是Pascal程序员,但它看起来像文本文件中的字段不是固定长度。您如何期望您的程序在回读期间划定每个字段?
因为您声明pavadinimas为字符串[30],无论字符串的长度是多少,它都会读取30个字符。例如,在下面的行pavadinimas将 “Skaitmenine LOGIKA 0”而不是只“Skaitmenine LOGIKA”
IF04 Skaitmenine logika 0
'KITI' 是 '字串' 或 '字符串[5]'? – 2011-02-10 20:31:23