Was ist der richtige Weg, um einen FILE * Pointer in C / C ++ zu deklarieren und zu benutzen? Sollte es global oder lokal erklärt werden? Kann jemand ein gutes Beispiel zeigen?
Es spielt keine Rolle, ob es lokal oder global ist. Der Umfang des Dateizeigers hat nichts mit seiner Verwendung zu tun.
Im Allgemeinen ist es eine gute Idee, globale Variablen so weit wie möglich zu vermeiden.
Hier ist ein Beispiel, das zeigt, wie man von input.txt
nach output.txt
kopiert:
Sie dürfen, wie jede andere Variable auch, globale Dateihandles deklarieren, aber das ist vielleicht nicht empfehlenswert.
Das ist die C-Art. C ++ kann das verwenden, aber ich denke, es gibt eine C ++ freundliche Art, es zu tun. Als Anmerkung hasse ich es, wenn Fragen mit C / C ++ markiert sind, weil C und C ++ nicht die gleiche Sprache sind und nicht gleich funktioniert. C ++ hat viele verschiedene Möglichkeiten, Dinge zu tun, die C nicht hat, und sie können für Sie im Kontext von C ++ einfacher sein, sind aber nicht gültig C. Während dies für beide Sprachen funktioniert, ist es nicht das, was Sie tun Wollen Sie, wenn Sie überwiegend C ++ verwenden.
BEARBEITEN: Es wurde eine Fehlerüberprüfung hinzugefügt. Verwenden Sie immer eine Fehlerüberprüfung in Ihrem Code.
Beachten Sie zunächst, dass ein Dateizeiger (und die zugehörige zugewiesene Struktur) auf den lower level () read () write () Aufrufen basiert. Der zugehörige Dateideskriptor (von fileno (file_pointer) erhalten, ist das am wenigsten interessante Ding, aber etwas, das Sie Ihren Bereich mit sehen sollten.)
Wenn Sie einen Dateizeiger in einem Modul als global deklarieren wollen, ist es normalerweise eine sehr gute Idee, ihn statisch zu halten (in diesem Modul / Objekt enthalten). Manchmal ist dies etwas einfacher als das Speichern in einer Struktur, die von Funktion zu Funktion übergeben wird, wenn Sie etwas in Eile schreiben müssen.
Zum Beispiel (schlecht)
%Vor%Besser gemacht als:
%Vor%NUR, Sie brauchen mehrere Module, um auf diesen Zeiger zugreifen zu können. In diesem Fall ist es besser, Sie in eine Struktur zu setzen, die herumgereicht werden kann.
Wenn es nur in einem Modul benötigt wird, sollten Sie es in main () deklarieren und anderen Funktionen erlauben, einen Dateizeiger als Argument zu akzeptieren. Also, es sei denn, Ihre Funktionen innerhalb des Moduls haben so viele Argumente, dass ein anderer unerträglich wäre. Es gibt (normalerweise) keinen Grund, einen Dateizeiger global zu deklarieren.
Einige Logging-Bibliotheken machen das, was mir egal ist ... besonders wenn es sich um wiederkehrende Funktionen handelt. Vereinheitlichen Sie den monolithischen Namensraum von C:)