2015-02-05 22 views
5

Mam mały program, w którym zainicjować ciąg i zapisu do pliku stream:Błąd std :: ofstream podczas zapisywania danych

#include<iostream> 
#include<fstream> 
using namespace std; 
int main() 
{ 
    std::ofstream ofs(file.c_str()); 
    string s="Hello how are you"; 
    if(ofs) 
    ofs<<s; 
    if(!ofs) 
    { 
     cout<<"Writing to file failed"<<endl; 
    } 
    return 0; 
} 

Moje miejsca na dysku jest bardzo mniej, a stwierdzenie "OFS < "zawiedzie. Więc wiem, że jest to błąd logicznie.

Oświadczenie "if (! Ofs)" nie napotkał powyższego problemu, dlatego nie jestem w stanie stwierdzić, dlaczego się nie udało.

Proszę mi powiedzieć, o jakie inne opcje będę mógł wiedzieć, że „OFS < nie powiodło się.

góry dziękuję.

+0

Czy sprawdziłeś, że 'ofstream' jest rzeczywiście otwarty przed próbą' z < emlai

+0

@zenith: Zmieniono to –

+0

'ofstream :: operator <<' zmodyfikuje wewnętrzne flagi stanu, jeśli się nie powiedzie. Czy sprawdziłeś 'ofstream :: eof' /' bad'/'fail'? – emlai

Odpowiedz

3

znalazłem rozwiązanie jak

#include<iostream> 
#include<fstream> 
using namespace std; 
int main() 
{ 
    std::ofstream ofs(file.c_str()); 
    string s="Hello how are you"; 
    if(ofs) 
    ofs<<s; 
    if(ofs.bad()) //bad() function will check for badbit 
    { 
     cout<<"Writing to file failed"<<endl; 
    } 
    return 0; 
} 

Można również odnieść się do poniższych linków here i there celu sprawdzenia poprawności.

+3

Byłbym bardzo zaskoczony, gdyby to zadziałało. Musisz zamknąć strumień lub przepłukać go, aby błąd został wykryty. –

+0

Czy jest szansa, że ​​strumień zostanie przepłukany, gdy w buforze zapisano dużą ilość danych wejściowych? W takim przypadku może to być warto dodać, aby program mógł zostać zakończony, gdy tylko zostanie zauważony błąd. – batbrat

9

W zasadzie, jeśli wystąpi błąd zapisu, badbit Błąd zostanie ustawiony tylko wtedy, gdy strumień rzeczywiście spróbuje zapisać, jednak , więc z powodu buforowania może być ustawiony na późniejszy zapis, niż gdy wystąpi błąd, lub nawet po zamknięciu . to “ przyklejony ”, tak na ce ustawić, pozostanie zestaw.

Zważywszy na powyższe, zwykłą procedurą jest po prostu sprawdzenie statusu wyjścia po zamknięciu; podczas wysyłania do std::cout lub std::cerr, po końcowy kolor. Coś jak:

std::ofstream f(...); 
// all sorts of output (usually to the `std::ostream&` in a 
// function). 
f.close(); 
if (! f) { 
    // Error handling. Most important, do _not_ return 0 from 
    // main, but EXIT_FAILUREl. 
} 

Podłączając std::cout, wymienić f.close() z std::cout.flush() (i oczywiście if (! std::cout)).

ORAZ: jest to standardowa procedura. Program, który ma kod powrotu 0 (lub EXIT_SUCCESS) w przypadku błędu zapisu, jest niepoprawny.

+0

Czy stwierdzenie dotyczące EXIT_FAILURE oznacza, że ​​kontynuowanie programu po wystąpieniu błędu zapisu jest niebezpieczne? Powinienem myśleć, że to niebezpieczne, ale chcę się tylko upewnić. – batbrat

+0

@batbrat Nie. Oznacza on, że program nie powinien zwracać '0' (_i.e. success), gdy wystąpił problem. –

+0

@ n.caillou Dobry punkt. Możemy powrócić do sukcesu, gdy wystąpi problem, tylko wtedy, gdy mamy do czynienia z nim całkowicie, prawda? – batbrat