2010-09-06 14 views
5

Supponiamo che qualcuno abbia scritto un metodo che apre un determinato file e dimentica di chiuderlo in alcuni casi. Dato questo metodo, posso assicurarmi che il file sia chiuso senza cambiando il codice del metodo originale?come assicurarsi che un file venga chiuso alla fine della corsa

L'unica opzione che vedo è scrivere un metodo che avvolge il metodo originale, ma questo è possibile solo se il file è definito al di fuori del metodo originale, giusto? Altrimenti è perduto per sempre ...

+1

Quale metodo si sta chiamando per aprire il file? – bjskishore123

+1

C++ ha funzioni, non metodi. –

+1

Se il metodo può "dimenticare" per chiudere il file, quindi non sta utilizzando un flusso di file C++. Che cosa sta invece usando? –

risposta

6

Poiché questo è C++, mi aspetto che venga utilizzata la libreria di flussi I/O (std::ifstream e amici), non la libreria legacy C I/O. In tal caso, sì, il file verrà chiuso perché lo stream viene chiuso dal distruttore dell'oggetto stream.

Se si utilizza l'API C legacy, quindi no, non si è fortunati.

A mio parere, la risposta migliore a una domanda di intervista come questa è di evidenziare il vero difetto del codice - gestire le risorse manualmente - e suggerire la soluzione corretta: utilizzare la gestione automatica delle risorse ("Acquisizione di risorse è Inizializzazione "o" Gestione della risorsa legata all'obiettivo ").

+0

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

+0

@James: Se si utilizza l'API C, la funzione _fcloseall() può essere utilizzata per chiudere tutti i file aperti. – bjskishore123

+2

@ bjskishore123: Non so da dove proviene '_fcloseall()', ma non fa parte della libreria standard C. Anche così, dato il suo nome, non vedo come ciò sarebbe molto utile in qualsiasi programma reale: il suo uso indicherebbe la carta in caso di errori gravi del programma. –

2

Si è certi che se il wrapper non ottiene in qualche modo un riferimento al file aperto, potrebbe essere difficile chiuderlo. Tuttavia, il sistema operativo potrebbe fornire un mezzo per ottenere un elenco di file aperti e potresti quindi trovare quello che devi chiudere.

Tuttavia, si noti che la maggior parte dei sistemi operativi (praticamente tutti) si occupa della chiusura dei file quando l'applicazione viene chiusa, quindi non è necessario preoccuparsi che un file venga lasciato aperto indefinitamente dopo l'arresto del programma. (Potrebbe essere o meno una risposta ragionevole alla domanda che ti è stata data, che sembra incredibilmente vaga e ambigua.)

0

In che ambiente ci si trova? Puoi sempre controllare i descrittori di file aperti dal processo e chiuderli con forza.

Sotto linux è possibile utilizzare il comando lsof per elencare i file aperti per un processo. Fatelo una volta prima del metodo e una volta dopo il metodo per rilevare i file appena aperti. Spero che non stiate combattendo contro una bestia legacy multithreaded.

1

Se si utilizza la funzione C per file aperti, è possibile utilizzare la funzione _fcloseall per chiudere tutti i file aperti.

Se si utilizza il C++, come suggerito da James, lo stream distructor dovrebbe occuparsene.

Problemi correlati