Ich kann es nicht verstehen, sollen wir nicht SEEK_CUR/SEEK_SET oder SEEK_END haben in dem woher? Warum hat es 2 und wie funktioniert es so?fseek (f, 0,2); Wie funktioniert das ohne SEEK_CUR/SEEK_SET oder SEEK_END?
Antwort
SEEK_SET
/SEEK_CUR
/SEEK_END
sind jeweils 0/1/2, Sie können die Nummer oder Definition verwenden.
Siehe Definitionen hier: http://unix.superglobalmegacorp.com/BSD4.4/newsrc/sys/unistd.h.html
/* whence values for lseek(2) */
#define SEEK_SET 0 /* set file offset to offset */
#define SEEK_CUR 1 /* set file offset to current plus offset */
#define SEEK_END 2 /* set file offset to EOF plus offset */
Natürlich ist es eine schlechte Praxis direkt, diese Zahlen zu verwenden, da es (wenn auch nicht wahrscheinlich) in zukünftigen Implementierungen ändern kann
Da SEEK_XXX Makros sind und ein bestimmter Wert, in diesem Fall ist SEEK_END gleich 2, also ist es dasselbe fseek (f, 0, SEEK_END), das fseek (f, 0,2), aber Sie sollten immer die Makros verwenden. Sie können diese Werte beispielsweise in den Notizen http://man7.org/linux/man-pages/man2/lseek.2.html (am Ende) sehen.
Schauen Sie in Ihre stdio.h
:
#define SEEK_END 2 /* Seek from end of file. */
So nach vorverarbeiten fseek(f, 0, SEEK_END)
becames fseek(f, 0, 2)
und Compiler 2
statt aussagekräftigen Namen sehen. Als Ergebnis können wir diesen Namen überhaupt vermeiden und Zahlenwerte direkt angeben.
fseek() benötigt drei Parameter.
erste ist die FILE * es
Zweitens ist die int Plattengröße, der Wert wird sich bemühen, es wird erwartet, dass in einem Sprung hüpfen. Beachten Sie, es kann auch ein negativer Wert sein.
Der dritte Parameter ist der Versatzwert, ab dem dieses Springen ausgeführt werden soll. Es gibt drei mögliche Werte für es 0,1 und 2. 0 stellt Anfang der Datei dar 1 stellt aktuellen Standort dar Und, 2 stellt das Ende der Datei dar.
Die SEEK_END, SEEK_CUR oder die SEEK_SET sind lediglich die Makroerweiterungen mit den Werten 2,1 und 0. Wenn ein Benutzer diese Makroerweiterungen verwendet, anstatt die tatsächlichen Werte darunter zu verwenden, ersetzen die Vorprozessoren jede solche Verwendung durch ihren entsprechenden Wert, und die Kompilierung wird wie üblich fortgesetzt.
In stdio.h
,
#ifndef SEEK_SET
#define SEEK_SET 0 /* set file offset to offset */
#endif
#ifndef SEEK_CUR
#define SEEK_CUR 1 /* set file offset to current plus offset */
#endif
#ifndef SEEK_END
#define SEEK_END 2 /* set file offset to EOF plus offset */
#endif
Der C11 sagt 'SEEK_CUR, SEEK_END, SEEK_SET' sind unterschiedliche Werte. Es gibt sie nicht als 0,1,2. – chux
@chux, ja, sie sind verschieden. Deshalb sind sie drei. Es ist ein Betriebsparameter, präzise funktionsbegrenzt. –
Diese Antwort sagt "Es gibt drei mögliche Werte für sie 0,1 und 2". Mein Kommentar weist darauf hin, dass dies von der C-Spezifikation nicht unterstützt wird. Ein konformer Compiler kann zwar auch andere eindeutige Werte oder eine andere Reihenfolge verwenden. – chux