Dummy-Read bei FileOfText

Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Dummy-Read bei FileOfText

 · 
Posted: 22.11.2020 - 08:57  ·  #1
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.
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1372
Registered: 03 / 2005
Subject:

Re: Dummy-Read bei FileOfText

 · 
Posted: 22.11.2020 - 12:00  ·  #2
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
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: Dummy-Read bei FileOfText

 · 
Posted: 22.11.2020 - 19:50  ·  #3
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
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1372
Registered: 03 / 2005
Subject:

Re: Dummy-Read bei FileOfText

 · 
Posted: 23.11.2020 - 00:08  ·  #4
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.
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Dummy-Read bei FileOfText

 · 
Posted: 23.11.2020 - 08:51  ·  #5
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
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: Dummy-Read bei FileOfText

 · 
Posted: 23.11.2020 - 12:58  ·  #6
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
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: Dummy-Read bei FileOfText

 · 
Posted: 23.11.2020 - 14:45  ·  #7
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
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: Dummy-Read bei FileOfText

 · 
Posted: 23.11.2020 - 15:45  ·  #8
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 😕 :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:
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   135   149 · Page-Gen-Time: 0.023371s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI