2010-09-06 12 views
5

Angenommen, jemand hat eine Methode geschrieben, die eine bestimmte Datei öffnet und vergisst, sie in einigen Fällen zu schließen. Kann ich bei dieser Methode sicherstellen, dass die Datei geschlossen ist ohne den Code der ursprünglichen Methode ändern?So stellen Sie sicher, dass eine Datei am Ende des Laufs geschlossen wird

Die einzige Option, die ich sehe, ist eine Methode schreiben, die die ursprüngliche Methode umschließt, aber das ist nur möglich, wenn die Datei außerhalb der ursprünglichen Methode definiert ist, richtig? Sonst ist es für immer verloren ...

+1

Mit welcher Methode wird die Datei geöffnet? – bjskishore123

+1

C++ hat Funktionen, keine Methoden. –

+1

Wenn die Methode "vergessen" kann, die Datei zu schließen, verwendet sie keinen C++ - Dateistream. Was benutzt es stattdessen? –

Antwort

6

Da dies C++ ist, würde ich erwarten, dass die I/O-Streams-Bibliothek (std::ifstream und Freunde) verwendet werden würde, nicht die Legacy-C-I/O-Bibliothek. In diesem Fall wird die Datei geschlossen, da der Stream vom Destruktor des Stream-Objekts geschlossen wird.

Wenn Sie die ältere C-API verwenden, dann haben Sie kein Glück. Die beste Antwort auf eine Interviewfrage wie diese ist, meiner Meinung nach, auf den wirklichen Fehler im Code hinzuweisen - Ressourcen manuell zu verwalten - und die richtige Lösung vorzuschlagen: automatische Ressourcenverwaltung zu verwenden ("Resource Acquisition is") Initialisierung "oder" Scope-Bound Resource Management ").

+0

RAII nach Wikipedia: http://en.wikipedia.org/wiki/Resource_acquisition_is_initialization – FuleSnabel

+0

@James: Wenn C-API verwendet wird, kann _fcloseall() -Funktion verwendet werden, um alle geöffneten Dateien zu schließen. – bjskishore123

+2

@ bjskishore123: Ich weiß nicht, wo '_fcloseall()' herkommt, aber es ist nicht Teil der C-Standard-Bibliothek. Trotzdem, angesichts seines Namens, sehe ich nicht, wie das in einem wirklichen Programm viel Nutzen bringen würde: seine Verwendung würde bedeuten, dass ernsthafte Programmfehler übertüncht werden. –

2

Sie haben Recht, wenn der Wrapper irgendwie keine Referenz auf die geöffnete Datei bekommt, kann es schwierig sein, sie zu schließen. Das Betriebssystem bietet jedoch möglicherweise die Möglichkeit, eine Liste der geöffneten Dateien abzurufen, und Sie können dann die Datei finden, die Sie schließen müssen.

Beachten Sie jedoch, dass die meisten (praktisch alle) Betriebssysteme dafür sorgen, dass Dateien beim Beenden der Anwendung geschlossen werden. Sie müssen sich also keine Sorgen machen, dass eine Datei nach dem Programmende unbegrenzt geöffnet bleibt. (Dies kann oder kann nicht eine vernünftige Antwort auf die Frage sein, die Ihnen gegeben wurde, die unglaublich vage und mehrdeutig scheint.)

0

In welcher Umgebung befinden Sie sich? Sie können die vom Prozess geöffneten Dateideskriptoren immer überprüfen und sie mit Nachdruck schließen.

Unter Linux können Sie den Befehl lsof verwenden, um geöffnete Dateien für einen Prozess aufzulisten. Tun Sie es einmal vor der Methode und einmal nach der Methode, um neu geöffnete Dateien zu erkennen. Hoffentlich kämpfst du nicht gegen ein Multithread-Biest.

1

Wenn Sie die C-Funktion zum Öffnen einer Datei verwenden, können Sie die Funktion _fcloseall zum Schließen aller geöffneten Dateien verwenden.

Wenn Sie C++ verwenden, wie James vorgeschlagen, sollte Stream Destructor darauf achten.

Verwandte Themen