closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

Dummy-Read bei FileOfText



Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 55
Posts: 1757
Registered: 03 / 2003
Private message
Subject: Dummy-Read bei FileOfText  -  Posted: 22.11.2020 - 08:57   -  
Hallo Zusammen,

ich hoffe ich geh euch noch nicht auf den Keks mit meinen vielen Fragen in letzter Zeit, aber ich baue grad was, das viel enthält, das ich noch nie verwendet habe.

Ich lese ein Textfile zeilenweise ein, das Konfigurationsdaten enthält. Dabei sind auch Kommentare erlaubt, deren Zeile mit einem / beginnt. Die Nutzdaten beginnen mit $01#, #N, #S oder #E.
Soweit kein Problem, aber laut Handbuch liest ein ReadLn nur bis entweder CR/LF oder bis die Variable voll ist. Mein Problem sind die Kommentarzeilen, die teilweise 100 Zeichen lang sind. Ich kann ja nicht eine Dummy-Variable mit String[100] definieren, nur um den Inhalt zu verwerfen.
Gibts keine elegantere Möglichkeit? Mein Speicher wird leider etwas knapp :D

Gruss
Harry

....... ich les mal weiter Handbuch.
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
Merlin offline
Schreiberling
Avatar
Gender: male
Location: UNITED KINGDOM 
Age:
Posts: 925
Registered: 03 / 2005
Private message
Subject: Re: Dummy-Read bei FileOfText  -  Posted: 22.11.2020 - 12:00   -  
The first thing to note is that the disk system uses an internal buffer of 128 bytes anyway. So using Read rather than readLn should not increase disc activity (hopefully). You already must have a file buffer defined for ReadLn, so you could always implement your own version of ReadLn (called something else obviously) that does what you want

Maybe something like

Code
procedure MyReadLn( const f: file of text; var s : string[ cBufferLen]  );
var
  Skipping : boolean;
  iChar : char;
  iLength : byte;
begin
  iLength := 0;
  Skipping := false;
  while not F16_EndOfFile( f ) do
    Read( f, iChar );
    if Skipping then
      case iChar of
        #13:
          Skipping := FALSe;
        |
      endcase;
    else
      case iChar of
        #13:
          SetLength( s, iLength );
          return;
        |
        #10: // ignore
        |
        '':
          if iLength = 0 then
            Skipping := TRUE;
          else
            Inc( iLength );
            s[ iLength ] := iChar;  // important to use iChar, not '' if using optimiser
          endif;
        |
      else
        Inc( iLength );
        s[ iLength ] := iChar;
      endcase;
    endif;
  endwhile;
  //if we get here  we have reached EOF without final CRLF
  SetLength( s, iLength );
  return;

end;


although I have not tested it
Merlin.

:magic:

Software is a black art.
This post has been edited 1-times. Last edit: 22.11.2020 - 14:00 by Merlin.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 55
Posts: 1757
Registered: 03 / 2003
Private message
Subject: Re: Dummy-Read bei FileOfText  -  Posted: 22.11.2020 - 19:50   -  
Hello Merlin,

not so complicated. I only want to discard the line if there is a '/' at the beginning of the line. but I don't want to define a variable with a length of 100 bytes. Or to put it another way, I want to jump to the next line. FileOfText ;) Text files can only be read sequentially.

Regards
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
Merlin offline
Schreiberling
Avatar
Gender: male
Location: UNITED KINGDOM 
Age:
Posts: 925
Registered: 03 / 2005
Private message
Subject: Re: Dummy-Read bei FileOfText  -  Posted: 23.11.2020 - 00:08   -  
That is what I am doing.

Sorry you think it is complicated.

You cannot avoid a sequential read or readln. Therefore you have to have a buffer enough for your longest line or read character-wise.

There is no built-in function to do what you want, if that is what you were hoping.

Regards

Merlin.
Merlin.

:magic:

Software is a black art.
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 49
Posts: 1168
Registered: 02 / 2009
Homepage Private message
Subject: Re: Dummy-Read bei FileOfText  -  Posted: 23.11.2020 - 08:51   -  
Quote by Harry

Hello Merlin,

not so complicated. I only want to discard the line if there is a '/' at the beginning of the line. but I don't want to define a variable with a length of 100 bytes. Or to put it another way, I want to jump to the next line. FileOfText ;) Text files can only be read sequentially.

Regards
Harry


Hallo Harry,

ReadLn bekommst Du ohne Buffer nicht dazu. Du kannst Dir aber einfach ein ReadLN selbst schreiben, dafür musst Du aber Zeichen- / Byteweise lesen. Wenn dann Deine Routine das besagte Zeichen erkannt hat, liest es die Zeile bis zum ende einfach durch, verarbeitet diese aber nicht. Ohne Handarbeit kommst Du da leider nicht rum.
Vielleicht findest Du ja irgendwo ein Pascal Code einer ReadLn, die Du dafür einfach anpassen kannst.

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 55
Posts: 1757
Registered: 03 / 2003
Private message
Subject: Re: Dummy-Read bei FileOfText  -  Posted: 23.11.2020 - 12:58   -  
Hallo Thorsten,

was macht denn ein Read, wenn das Zeilenende erreicht wurde? Ich vermute, es springt zur nächsten. Da aber ein CR/LF niemals durch Read gelesen werden kann, zumindest habe ich in der Doku gelesen, daß #13 + #10 nicht im String steht, kann ich auch nicht feststellen, ob ich über das Zeilenende hinaus gesprungen bin und schon in der nächsten Zeile lese. Dann müßte ich jedes (!) gelesene Zeichen auswerten, ob eine meiner Startmarkierungen vorkommt ..... solange das keiner in den Kommentaren verwendet ok, aber .....

Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
pvs-deck offline
PowerUser
Avatar
Gender: male
Location: GERMANY 
Age: 49
Posts: 1168
Registered: 02 / 2009
Homepage Private message
Subject: Re: Dummy-Read bei FileOfText  -  Posted: 23.11.2020 - 14:45   -  
Quote by Harry

Hallo Thorsten,

was macht denn ein Read, wenn das Zeilenende erreicht wurde? Ich vermute, es springt zur nächsten. Da aber ein CR/LF niemals durch Read gelesen werden kann, zumindest habe ich in der Doku gelesen, daß #13 + #10 nicht im String steht, kann ich auch nicht feststellen, ob ich über das Zeilenende hinaus gesprungen bin und schon in der nächsten Zeile lese. Dann müßte ich jedes (!) gelesene Zeichen auswerten, ob eine meiner Startmarkierungen vorkommt ..... solange das keiner in den Kommentaren verwendet ok, aber .....

Gruss
Harry


Hallo Harry,

soweit ich weiss wird bei Read() jedes Byte gelesen. Ich habe es zwar beim AVRco noch nicht genutzt, aber bei Delphi ist das so.

Thorsten
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 55
Posts: 1757
Registered: 03 / 2003
Private message
Subject: Re: Dummy-Read bei FileOfText  -  Posted: 23.11.2020 - 15:45   -  
Ok Thorsten, hast Recht. Dann hatte ich das falsch in erinnerung ;)
Quote
Procedure Read (f : file; var string|char); Liest ein Zeichen aus dem File in das Ziel, das eine Char oder String Variable sein kann. Ein String bekommt dann die Länge 1. Es werden auch die Limiter CR und LF gelesen und übertragen.

Procedure ReadLn (const f : file; var string|char);
Liest einen String aus dem File in das Ziel, das eine Char oder String Variable sein kann. Bei einem Char als Ziel bricht die Funktion natürlich sofort nach einem Zeichen ab und macht deshalb normalerweise wenig Sinn. Ein String wird gefüllt bis entweder der String voll ist oder ein CRLF erkannt wird. War der String schon vorher voll, bleibt der Lesepointer an dieser Stelle stehen. Das Längenbyte des Ziel Strings wird auf die richtige Länge gesetzt. Die Limiter CR und LF werden zwar gelesen aber niemals in den String übertragen.


Sind dann CR und LF 2 verschiedene Zeichen? Hmmmm :confused: :augenauf:

Harry

.... hats dir schon mal eine SD-Karte zerbröselt (Dateisystem defekt) nur durch Abschalten der Spannung? Ich öffne die Datei, lese meine Konfiguration und schliesse sie gleich wieder. Trotzdem ists passiert :(

Ok noch ne blöde Frage:
Wieso kann ich das lesend nicht benutzen
Code
Var 
  SD_CD[@PortC,1]      : Bit;              // SD-Card Card-Detect 

If SD_CD=0 .... oder 1 

If SD_CD=false .... oder true 


das geht
Code
If (PinC and $02)=$02 
      then


ahhhhh muß das
Code
  SD_CD[@PinC,1]      : Bit;              // SD-Card Card-Detect

heißen?

Funktioniert :blob7:
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 3-times. Last edit: 23.11.2020 - 16:02 by Harry.
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 20.01.2021 - 23:34