在 Pascal 中跳过 txt 文件中的每一行
Skip every second line in a txt file in Pascal
这是我的代码(不要介意德语变量名):
IF Frage = 1 THEN
BEGIN
Reset(Textdatei);
Writeln;
i := 0;
WHILE NOT EoF(Textdatei) DO
BEGIN
Inc(i);
Readln(Textdatei,Dateiname);
// NUMMER
IF i < 10 THEN
BEGIN
Temp := Copy(Dateiname,2,1); // Speichert position als Str
posTemp := StrToInt(Temp); // position wird als Int gespeichert
pos0 := posTemp;
END;
IF (i < 100) AND (i > 9) THEN
BEGIN
Temp := Copy(Dateiname,2,2);
posTemp := StrToInt(Temp);
pos0 := posTemp;
END;
IF (i >= 100) THEN
BEGIN
Temp := Copy(Dateiname,2,3);
posTemp := StrToInt(Temp);
pos0 := posTemp;
END;
// NAME
posTemp := pos(' ',Dateiname);
posTemp2:= pos('.',Dateiname);
UnknownLength := (posTemp2-1) - posTemp;
Temp := Copy(Dateiname,posTemp+1,UnknownLength);
Name := Temp;
// KG
posTemp := pos('// ',Dateiname);
posTemp2:= pos('kg',Dateiname);
posTemp := posTemp + 2;
UnknownLength := (posTemp2-1) - posTemp;
Temp := Copy(Dateiname,posTemp,UnknownLength);
posTemp := StrToInt(Temp);
KG := posTemp;
//Liste beschreiben
Liste := AddElement(Name, pos0, KG, Liste);
END;
END;
ClrScr;
Writeln('Laden erfolgreich!');
Readkey;
Submenu();
所以,这段代码不能正常工作,因为我加载的 txt 文件包含空行。更准确地说:txt 中的每一行都是空的。这意味着,在用 txt 中的元素填充我的链表时,我必须跳过每个空行。
- 如何让编译器跳过每 2 个空行?
- 如何让我的编译器只读取特定行?
如果你回答了我的任何一个问题,我终于可以完成我的小程序了。
我的 txt 的内部看起来完全像这样:
#1: Bisasam. // 11 kg
#2: Bisaknosp. // 22 kg
#3: Bisaflor. // 33 kg
正如您所见,每隔一行都是空白行,当它试图将空白行加载到我的列表时,它崩溃了。
您可以只添加一个额外的 Readln
来跳过空白行,因此您的代码变为:
...
WHILE NOT EoF(Textdatei) DO
BEGIN
Inc(i);
// *** read non-empty line containing data ***
Readln(Textdatei,Dateiname);
...
//Liste beschreiben
Liste := AddElement(Name, pos0, KG, Liste);
// *** skip empty line ***
Readln(Textdatei);
END;
...
请注意,这里假设 non-empty 行是文件中的奇数行,即第一行是 non-empty,第二行是空的,等等。如果反过来然后将 Readln(Textdatei);
移动到 WHILE
循环的开头而不是结尾。
这是我的代码(不要介意德语变量名):
IF Frage = 1 THEN
BEGIN
Reset(Textdatei);
Writeln;
i := 0;
WHILE NOT EoF(Textdatei) DO
BEGIN
Inc(i);
Readln(Textdatei,Dateiname);
// NUMMER
IF i < 10 THEN
BEGIN
Temp := Copy(Dateiname,2,1); // Speichert position als Str
posTemp := StrToInt(Temp); // position wird als Int gespeichert
pos0 := posTemp;
END;
IF (i < 100) AND (i > 9) THEN
BEGIN
Temp := Copy(Dateiname,2,2);
posTemp := StrToInt(Temp);
pos0 := posTemp;
END;
IF (i >= 100) THEN
BEGIN
Temp := Copy(Dateiname,2,3);
posTemp := StrToInt(Temp);
pos0 := posTemp;
END;
// NAME
posTemp := pos(' ',Dateiname);
posTemp2:= pos('.',Dateiname);
UnknownLength := (posTemp2-1) - posTemp;
Temp := Copy(Dateiname,posTemp+1,UnknownLength);
Name := Temp;
// KG
posTemp := pos('// ',Dateiname);
posTemp2:= pos('kg',Dateiname);
posTemp := posTemp + 2;
UnknownLength := (posTemp2-1) - posTemp;
Temp := Copy(Dateiname,posTemp,UnknownLength);
posTemp := StrToInt(Temp);
KG := posTemp;
//Liste beschreiben
Liste := AddElement(Name, pos0, KG, Liste);
END;
END;
ClrScr;
Writeln('Laden erfolgreich!');
Readkey;
Submenu();
所以,这段代码不能正常工作,因为我加载的 txt 文件包含空行。更准确地说:txt 中的每一行都是空的。这意味着,在用 txt 中的元素填充我的链表时,我必须跳过每个空行。
- 如何让编译器跳过每 2 个空行?
- 如何让我的编译器只读取特定行?
如果你回答了我的任何一个问题,我终于可以完成我的小程序了。
我的 txt 的内部看起来完全像这样:
#1: Bisasam. // 11 kg
#2: Bisaknosp. // 22 kg
#3: Bisaflor. // 33 kg
正如您所见,每隔一行都是空白行,当它试图将空白行加载到我的列表时,它崩溃了。
您可以只添加一个额外的 Readln
来跳过空白行,因此您的代码变为:
...
WHILE NOT EoF(Textdatei) DO
BEGIN
Inc(i);
// *** read non-empty line containing data ***
Readln(Textdatei,Dateiname);
...
//Liste beschreiben
Liste := AddElement(Name, pos0, KG, Liste);
// *** skip empty line ***
Readln(Textdatei);
END;
...
请注意,这里假设 non-empty 行是文件中的奇数行,即第一行是 non-empty,第二行是空的,等等。如果反过来然后将 Readln(Textdatei);
移动到 WHILE
循环的开头而不是结尾。