2015-01-31 11 views
19

Poniżej znajduje się kod dla tego samego przypadku.Co się stanie, jeśli nigdy nie wywołasz polecenia `close` w otwartym strumieniu plików?

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() { 
    ofstream myfile; 
    myfile.open ("example.txt"); 
    myfile << "Writing this to a file.\n"; 
    //myfile.close(); 
    return 0; 
} 

Jaka będzie różnica, jeśli odkomentuję linię myfile.close()?

+0

Możesz znaleźć to pytanie W odpowiedzi na swoje pytanie także: [Czy automatycznie zamyka swoje pliki?] (Http://stackoverflow.com/q/12900016/1364007). –

Odpowiedz

25

Nie ma różnicy. Destruktor strumienia plików zamknie plik.

Można również polegać na konstruktorze, aby otworzyć plik, zamiast dzwonić pod numer open(). Kod może zostać zmniejszona do tego:

#include <fstream> 

int main() 
{ 
    std::ofstream myfile("example.txt"); 
    myfile << "Writing this to a file.\n"; 
} 
+5

Albo nawet 'std :: ofstream (" example.txt ") <<" Zapisanie tego do pliku. \ N ";' – Deduplicator

8

Aby wzmocnić odpowiedź juanchopanza jest z pewnym odniesieniem od std::fstream documentation

(destruktor)
[wirtualny] (niejawnie zadeklarowanej)

niszczy się basic_fstream i powiązany z nim bufor, zamyka plik (wirtualny publiczny użytkownik ction)

5

W tym przypadku nic się nie stanie, a czas wykonania kodu jest znacznie mniejszy.

Jeśli jednak twoje kody będą działały przez długi czas, gdy ciągle otwierasz pliki i nie zamykasz, po pewnym czasie może nastąpić awaria w czasie wykonywania.

Po otwarciu pliku system operacyjny tworzy pozycję do reprezentowania tego pliku i zapisuje informacje o tym otwartym pliku. Więc jeśli w twoim OS jest 100 plików, to będzie 100 wpisów w systemie operacyjnym (gdzieś w jądrze). Te wpisy są reprezentowane przez liczby całkowite, takie jak (... 100, 101, 102 ....). Ten numer pozycji jest deskryptorem pliku. Jest to po prostu liczba całkowita, która jednoznacznie reprezentuje otwarty plik w systemie operacyjnym. Jeśli twój proces otworzy 10 plików, to twoja tabela procesu będzie miała 10 wpisów dla deskryptorów plików.

Ponadto, w przypadku otworzenia dużej liczby plików na raz może wystarczyć deskryptor pliku. Co uniemożliwi uruchamianie systemów * nix, ponieważ otwierają one deskryptory do rzeczy w/proc przez cały czas.

Podobnie powinno się stać w przypadku wszystkich systemów operacyjnych.

+0

Nie uniemożliwi to uruchomienia całego systemu, aplikacja nie otworzy więcej plików . – Ruslan

+0

Może to uniemożliwić uruchomienie całej aplikacji. – immibis

+0

Należy również zauważyć, że system Windows nie używa liczb całkowitych dla deskryptorów plików, ani nie nazywa ich deskryptorami plików. – immibis

1

W normalnych warunkach nie ma różnicy.

ALE w wyjątkowych warunkach (z niewielką zmianą) wezwanie do zamknięcia może spowodować wyjątek.

int main() 
{ 
    try 
    { 
     ofstream myfile; 
     myfile.exceptions(std::ios::failbit | std::ios::badbit); 
     myfile.open("example.txt"); 

     myfile << "Writing this to a file.\n"; 


     // If you call close this could potentially cause an exception 
     myfile.close(); 


     // On the other hand. If you let the destructor call the close() 
     // method. Then the destructor will catch and discard (eat) the 
     // exception. 
    } 
    catch(...) 
    { 
     // If you call close(). There is a potential to get here. 
     // If you let the destructor call close then the there is 
     // no chance of getting here. 
    } 
}