Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Delphi] End of line EoLn probleem

Pagina: 1
Acties:
  • 393 views sinds 30-01-2008
  • Reageer

  • DaFreakda
  • Registratie: September 2000
  • Laatst online: 02-11-2022
Dit is mn eerste post in programming, hopelijk voldoet de inhoud aan de forumeisen :)

Ik wil data uit een txt file uitlezen en in een array zetten, maar er gaat iets fout, delphi ziet de end of line niet.
Ik ben een goede noob wat betreft programmeren dus ik doe vast iets heel stoms, of vergeet iets, maar na 3uur internet afstruinen is t nog steeds niet gelukt.

De input.txt ziet er zo uit, heb een deel gekopieerd:
code:
1
2
3
4
5
6
{KnummerGen K   %   K   %   K   %   K   %  K   %   K   %   K   %   K   % }
1  
2                    16  80  14  10  6   10 
3                     7   40  9   20  8   10  13  30
....
//


Er staat hier dat Knoop1 niets stuurt naar andere knopen, knoop2 stuurt 80% naar Knoop 16 etc, knoop3 40% naar Knoop 7 etc.
Dit wil ik in een array krijgen als [2,16]:=80 enzovoort.
Ik dacht eigenlijk dat Delphi vanzelf de nieuwe regel zou herkennen in de txt file, maar helaas hij raast alle regels langs. Als EndOfFile marker gebruik ik overigens '//' omdat dat de manier van TOMAS is, dit werkt prima. Ik heb geprobeerd in de input.txt \r\n of #10#13 te gebruiken aan t einde van elke regel, maar ik ben denk ik ergens iets vergeten want gaf enkel errors...

Stukje code:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
  AssignFile(myFile, 'input.txt');
  reset(MyFile);
  While not EOF(myFille) do
  begin
    ...
    While not (eoln(MyFile)) do
    begin
       ...
    end;
  end;
  CloseFile(myFile);


Kortom: wat moet ik in de input.txt file zetten zodat delphi de EoLn herkent? En wat is de standaard manier van delphi om de EndofFile te herkennen eigenlijk?

  • DeoDupke
  • Registratie: Maart 2002
  • Laatst online: 26-03-2024
kun je niet een readln gebruiken?

No worries m8


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-11 15:10

Creepy

Tactical Espionage Splatterer

Hoe lees je nu precies de regels in? Met read? Of met readln?

ReadLn leest altijd 1 regel in en dan heb je de eoln() check dus niet nodig. eoln() werkt alleen als je steeds maar 1 karakter inleest (en dat is traag) en de filepointer precies op een end of line karaker(s) staat.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Enne... pssst: code tags ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DaFreakda
  • Registratie: September 2000
  • Laatst online: 02-11-2022
DeoDupke schreef op woensdag 18 juli 2007 @ 12:13:
kun je niet een readln gebruiken?
Readln leest elke regel in 1 keer in zn geheel, kan ik dan dus de verschillende Waarden uit deze regel 1voor1 gebruiken?
Ik zie even niet hoe dat zou moeten...

code:
1
2
3
4
 while not Eof(myFile) do
  begin
    ReadLn(myFile);
    a:=(IntToStr(1eGetal);



Hoe definieer ik dan dus uit deze hele regel de losse waarden? Ik heb t idee dat t iets heel eenvoudigs moet zijn eigenlijk... 8)7

  • DeoDupke
  • Registratie: Maart 2002
  • Laatst online: 26-03-2024
je kunt 1 regel in een sting zetten en die gaan doorlopen en de waardes die je tegenkomt gebruiken, zo te zien zijn de waardes gescheiden door spaties, dus daar moet je dan op gaan zoeken

misschien heb je hier wat aan:
http://www.delphibasics.co.uk/RTL.asp?Name=ReadLn

[ Voor 51% gewijzigd door DeoDupke op 18-07-2007 12:27 ]

No worries m8


  • DaFreakda
  • Registratie: September 2000
  • Laatst online: 02-11-2022
Bedankt voor de reacties!

De fout komt denk ik ook omdat ik TOMAS (delphi software add-on van TU-Delft) gebruik en nu dingen door elkaar aan t halen ben.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
infile_generator:=tomasfile.Create('BPM_Distributie.txt');
  AssignFile(myFile, 'BPM_Distributie.txt');
  reset(MyFile);
  While NOT (infile_generator.FileMarker) do
  begin
    GeneratorNummer:=infile_generator.GetString;
    TPostgenerator.Create('PostGeneratorKnoop'+GeneratorNummer);
    //Distributie van deze knoop uitlezen en toevoegen aan de distributie array
   While not (eoln(MyFile)) do
    begin  
      KnoopDestNummer:=strtoInt(infile_generator.GetString);
      procent:=strtoInt(infile_generator.GetString);
      GNummer:=strtoInt(GeneratorNummer);
      DistributieArray[GNummer,KnoopDestNummer]:=procent;
     end;


Nu wordt de EoLn dus niet herkend helaas. Ik ga even stuntelen met standaard Delphi methode, en ReadLn gebruiken, kijken of ik eruit kom.

[ Voor 4% gewijzigd door DaFreakda op 18-07-2007 12:34 ]


  • DaFreakda
  • Registratie: September 2000
  • Laatst online: 02-11-2022
Nou het werkt, al is het denk ik niet zo netjes...moet anders kunnen maar voorlopig laat ik het maar zo.
Als iemand weet hoe ik kan voorkomen dat die getString comment in " While infile_generator.GetString <> '@' do " ervoor zorgt dat ik de 'Z' in de inputfile moet zetten hoor ik dat graag :)

Inputfile:
code:
1
2
3
4
5
6
7
8
9
10
{KnummerGen K   %   K   %   K   %   K   %  K   %   K   %   K   %   K   % }
{@ is end of line teken en Z is nodig voor correct uitlezen door extra getString comment}
1 @
2      Z     16  80 Z 14  10 Z 6   10 @ 
3      Z     7   40 Z 9   20 Z 8   10 Z 13  30 @
4 @          
5 @           
6 @           
7 @          
//



Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
begin

  infile_generator:=tomasfile.Create('BPM_Distributie.txt');
  AssignFile(myFile, 'BPM_Distributie.txt');
  reset(MyFile);
  While not (infile_generator.FileMarker) do
  begin
    Readln(MyFile);
    GeneratorNummer:=infile_generator.GetString;
    TPostgenerator.Create('PostGeneratorKnoop'+GeneratorNummer);
    While infile_generator.GetString <> '@'  do
      begin
       //Distributie van deze knoop uitlezen en toevoegen aan de distributie array
       KnoopDestNummer:=StrtoInt(infile_generator.GetString);
       procent:=StrtoInt(infile_generator.GetString);
       GNummer:=StrtoInt(GeneratorNummer);
       DistributieArray[GNummer,KnoopDestNummer]:=procent;
      end;
  end;
  CloseFile(myFile);
end;

  • DeoDupke
  • Registratie: Maart 2002
  • Laatst online: 26-03-2024
ik vind die input.txt maar een beetje vaag, maak je die zelf, of is dat een output van een ander programma? Heeft het aantal spaces in die tekstfile nog een betekenis of is het gewoon

1e aantal cijfers tot space is 'knoopnr'

dan volgende aantal cijfers tot space is 'destination knoopnr'
dan volgende aantal cijfers tot aan space is 'percentage'

laatste 2 regels herhalen tot einde van de regel ( die regel kun je inlezen met een readln )

No worries m8


  • DaFreakda
  • Registratie: September 2000
  • Laatst online: 02-11-2022
DeoDupke schreef op woensdag 18 juli 2007 @ 14:28:
ik vind die input.txt maar een beetje vaag, maak je die zelf, of is dat een output van een ander programma? Heeft het aantal spaces in die tekstfile nog een betekenis of is het gewoon

1e aantal cijfers tot space is 'knoopnr'

dan volgende aantal cijfers tot space is 'destination knoopnr'
dan volgende aantal cijfers tot aan space is 'percentage'

laatste 2 regels herhalen tot einde van de regel ( die regel kun je inlezen met een readln )
Die invoerfile heb ik zelf gemaakt, ziet er niet echt mooi uit kloptklopt. Die spaties hebben idd geen betekenis en zitten er in om het iets overzichtelijker te maken, dat is zo in notepad maar hier in the code op t forum niet echt het geval.
Hoe jij t beschrijft is hoe het werkt inderdaad, eerst knoopnummer dan destination+percentage aantal keer. Zou jij het anders doen dan? Dus een loopje die spaties afgaat tot een cijfer, en dan het cijfer opslaat tot de volgende spatie? Zoiets?

  • DaFreakda
  • Registratie: September 2000
  • Laatst online: 02-11-2022
Om met mijn uiteindelijke oplossing deze thread af te sluiten mn final code, ik vind t mooi zat zo :)
Ik gebruik nu alleen '@' als end-of-line teken en heb die extra/lelijke Z in de invoerfile niet meer nodig.
Bedankt voor de hulp!

code:
1
2
3
4
5
6
7
8
9
{KnummerGen K   %   K   %   K   %   K   %  K   %   K   %   K   %   K   % }
{End of Line teken @}
1 @
2  16  80  14  10  6   10 @ 
3   7   40  9   20  8   10  13  30 @
4 @          
5 @           
6 @  
//



Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  begin
    Readln(MyFile);
    GeneratorNummer:=infile_generator.GetString;
    Generator:=TPostgenerator.Create('PostGeneratorKnoop'+GeneratorNummer);
    Generator.GeneratorNummer:=StrtoInt(GeneratorNummer);
    p:=infile_generator.GetString;
    While p <> '@'  do
      begin
       //Distributie van deze knoop uitlezen en toevoegen aan de distributie array
       KnoopDestNummer:=StrtoInt(p);
       procent:=StrtoInt(infile_generator.GetString);
       GNummer:=StrtoInt(GeneratorNummer);
       DistributieArray[GNummer,KnoopDestNummer]:=procent;
       p:=infile_generator.GetString;
      end;
    Generator.Start(Tnow);
    Generator.ArrivalTimes:=TExponentialDistribution.Create(520623,1);
  end;
  CloseFile(myFile);

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Het zijn wel lagacy-functies, welke niet echt de netheid van je code bevorderen. Delphi is voor mij alweer een tijdje geleden, maar ik weet 100% zeker dat Delphi ook gewoon een TFileStream heeft. Bovendien zou ik, om tekstbestanden regel-voor-regel in te lezen, eerder kiezen voor een TStringList als het om kleine bestandjes gaat. Verbruikt wat meer geheugen, maar de file wordt minder lang gelocked en een TStringList is veel makkelijker benaderbaar.

[ Voor 5% gewijzigd door _Thanatos_ op 19-07-2007 13:48 ]

日本!🎌

Pagina: 1