Christian Seiler: fgets Problem wenn Datei 0 enthält

Beitrag lesen

Hallo Tom,

Wenn Du das Verhalten einer Funktion von heute auf morgen einfach ändern würdest, was meinst Du, wie viele Programme dann plötzlich nicht mehr funktionieren würden?

eben das ist eben mit fread() geschehen in PHP.

fread() war vorher Buggy beim Lesen von 0 Bytes in bestimmten Zusammenhängen. Nachdem das Lesen von 0 Bytes niemals sinnvoll sein kann, haben die Entwickler beschlossen, den Fall lieber komplett zu verbieten, als zu versuchen, irgend etwas sinnlos zu fixen. Ich kann das gut nachvollziehen.

Aber ok, natürlich hast Du recht, dass das Verhalten geändert wurde. Ich sehe das nur im Fall von "Lesen von 0 Bytes" absolut nicht kritisch, weil das sowieso sinnlos ist. Bei fgets() ist es dagegen kritisch, weil die korrekte Angabe der Maximallänge wichtig sein kann.

Früher hat es erwartungsgemäß reagiert und nicht bei ordnungsgemäßer Benutzung eine Warnung ausgelöst.

Wie oft denn noch: 0 Bytes lesen ist keine ordnungsgemäße Benutzung.

Stell Dir vor, Du gehst in den Supermarkt an die Kasse, legst nichts auf das Band und willst dann Zahlen. Du kannst dann zwar sicher aus dem Supermarkt heraus, ohne zahlen zu müssen, aber die Kassiererin wird Dir ohne Artikel keinen Bon ausdrucken lassen, auf dem 0 Euro steht. Wozu auch?

Ich halte jeden I/O-Algorithmus, der 0 Bytes lesen will, für kaputt.

Wenn jemand -1 Bytes anfordert, dann erwarte ich eine Fehlermeldung

Und eine solche wäre in meinen Augen auch bei 0 nicht verkehrt.

An der Deklaration der Funktion hat sich übrigens nichts geändert, sondern nur an den "Nutzungsbedingungen", und die gehören zur Implementation.

Nein, die gehören ganz klar zur Definition der Funktion. Nicht zur Definition auf Compilerebene, aber wenn ich eine Funktion habe, dann ist das erwartete Verhalten Teil der Schnittstelle, die die Funktion mir bietet.

Denn für ein bestimmtes erwartetes Verhalten gibt es sehr viele Möglichkeiten der Implementierung.

Nehmen wir zum Beispiel mal Sortieralgorithmen: Wenn ich einen Sortieralgorithmus habe, der mir Daten stabil sortiert und den dann in eine Funktion packe, die das Array als Parameter übergeben bekommt und mir dann das sortierte Array zurückliefert - dann ist die Schnittstelle dieser Funktion "nimm Eingabearray und gebe es sortiert zurück, behalte bei gleichen Werten aber die Ursprungsreihenfolge bei". Wenn ich die Implementierung dann aber austausche, d.h. einen anderen Sortieralgorithmus nehme, dann ändert sich die Definition der Funktion nicht, solange er das Kriterium der Stabilität auch erfüllt.

Viele Grüße,
Christian