On 08/03/2022 13:27, Dirk Krause wrote:
> Am 02.08.22 um 17:39 schrieb Helmut Schellong:
> ...
>> Ein Puffer für unbekannte Zeilen sollte heutzutage 1 MB fassen können.
>> Einfach im Stack anlegen; ist schnell und sicher.
>>
>
> Mein Vorschlag wäre, dies konfigurabel zu gestalten.
> Der Puffer wird mit malloc() angefordert.
> Für die Puffergröße ist im Programm ein Standardwert
> voreingestellt, der im Normalfall alles abdeckt.
Meine letzte Programmierung, wo ich Dateien lese und schreibe, ist
http://www.schellong.de/htm/dragon.c.html
Zeilen 93..96, 119,120, 126, 134..146.
'buf' hat 16 KB, was in Zusammenarbeit mit Caches optimal ist.
In Zeile 142 kann 'nb' negativ sein!
read() und write() haben Vorteile gegenüber fread() und fwrite().
Der Algorithmus dürfte ziemlich optimal sein.
> Ueber eine Option -- z.B. -l <Groesse> -- kann eine andere
> Puffergroesse eingestellt werden. Dabei muss das Argument
> natuerlich geprueft werden, um zu kleine und ggf. auch zu
> grosse Werte zu vermeiden.
> Wird fortlaufend mit fgets() eingelesen und ist nach erfolg-
> reichem fgets() das letzte Zeichen vor dem Nullbyte kein
> Newline, bricht das Programm mit der Fehlermeldung
> "FEHLER: Die aktuelle Puffergroesse 16384 ist zu klein!
> Bitte nutzen Sie Option -l ..., um einen groesseren
> Puffer zu verwenden."
> ab. Die 16384 sind hier nur ein Beispiel fuer die aktuelle
> Puffergroesse.
Ich wähle eigentlich immer andere Konzepte.
Und zwar an die Aufgabe (u.a.) angepaßte Konzepte.
Wenn ich einen Puffer mit 1 MB für Zeilen verwende, ist es ein Fehler
mit Abbruch, falls bis zu dessen Ende _kein_ Newline gefunden wird!
Ich arbeite meist nicht 0-terminiert, sondern speichere Pointer
oder Positionen und jeweilige Länge.
Einen Rest kopiere ich auch nach vorne, je nach Konzept und Aufgabe.
Puffer lege ich fast immer im Stack an.
Das ist schnell und sicher, und man kann so ohne weiteres 50 MB anlegen,
was als Puffer (für read()) stets reichen dürfte.
malloc() habe ich seit 1985 nur zweimal verwendet.
Auch 'read(fd, buf+o,' kommt oft bei mir vor.