2011-02-10 157 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