Es kann einen Leistungsunterschied geben oder auch nicht. Es gibt einen Unterschied in der Semantik.
fread(a, 1, 1000, stdin);
versucht, 1000 Datenelemente zu lesen, von denen jedes 1 Byte lang ist.
fread(a, 1000, 1, stdin);
versucht 1 Datenelement zu lesen, das 1000 Bytes lang ist.
Sie sind anders, weil fread()
die Anzahl der Datenelemente zurückgeben, die gelesen werden konnten, nicht die Anzahl der Bytes. Wenn es vor dem Lesen der vollen 1000 Bytes das Dateiende (oder eine Fehlerbedingung) erreicht, muss die erste Version genau angeben, wie viele Bytes es gelesen hat. Die zweite schlägt einfach fehl und gibt 0 zurück.
In der Praxis wird wahrscheinlich nur eine untergeordnete Funktion aufgerufen, die versucht, 1000 Bytes zu lesen, und angibt, wie viele Bytes tatsächlich gelesen werden. Bei größeren Lesevorgängen werden möglicherweise mehrere Anrufe auf niedrigerer Ebene getätigt. Die Berechnung des von zurückzugebenden Wertesfread()
ist unterschiedlich, aber der Aufwand für die Berechnung ist trivial.
Es kann einen Unterschied geben, wenn die Implementierung vor dem Versuch, die Daten zu lesen, feststellen kann, dass nicht genügend Daten zum Lesen vorhanden sind. Wenn Sie beispielsweise aus einer 900-Byte-Datei lesen, liest die erste Version alle 900 Byte und gibt 900 zurück, während die zweite möglicherweise nicht die Mühe macht, etwas zu lesen. In beiden Fällen wird die Dateipositionsanzeige um die Anzahl der Zeichen vorgerückt erfolgreich gelesenen , dh 900, .
Aber im Allgemeinen sollten Sie wahrscheinlich auswählen, wie Sie es aufrufen möchten, basierend auf den Informationen, die Sie daraus benötigen. Lesen Sie ein einzelnes Datenelement, wenn ein teilweises Lesen nicht besser ist, als überhaupt nichts zu lesen. Lesen Sie kleinere Blöcke ein, wenn Teillesungen hilfreich sind.
fread(a, 1000, N, stdin);
der fp-Indikator nicht immer um ein Vielfaches von1000
?