2013-04-03 7 views
2

J'ai eu des problèmes étranges écriture dans le fichier avec ofstreams et maintenant queDébogage C++ des états fail()?

ofstream.fail() 

est vrai juste après retournaient mon ofstream.open() appel.

Existe-t-il des moyens d'obtenir des informations supplémentaires, comme plus de détails sur la raison pour laquelle l'état d'échec a été défini?

EDIT, informations supplémentaires: is_open() renvoie la valeur false.

+0

que dit 'is_open()'? – jrok

+0

is_open() renvoie la valeur false. – user788171

+0

Selon ce .. http://www.cplusplus.com/reference/ios/ios/fail/ Je suppose que la fonction ne vous aidera pas à creuser dans la cause réelle de l'échec ... –

Répondre

0
io_state word=ofstream.rdstate(); 
if(word & ios::failbit){ 
    cout<<"Failbit flag is set"; 
} 
//etc 
1

Assurez-vous que ofstream ne dispose pas d'un fichier associé déjà (ouvert un fichier avec ce flux déjà). Selon http://www.cplusplus.com/reference/fstream/ofstream/open/:

Si l'objet a déjà un fichier associé (ouvert), la fonction échoue. En cas d'échec, l'indicateur d'échec est défini (ce qui peut être vérifié si le membre échoue) et, en fonction de la valeur définie avec des exceptions, une exception peut être levée.

Si vous avez ouvert un fichier, fermez-le avant de l'ouvrir.

Edit: Comme indiqué ci-dessus, vous pouvez vérifier que 'failbit flag est définie à l'aide stream.rdstate()

1

Ayant tout juste trouvé la même situation, je pris la résolution d'une faute de frappe qui avait lu

si (outfile.is_open()!)

{

}

ne remarquant pas le point-virgule après si statment ...

0

Citant this
std::string DescribeIosFailure(const std::ios& stream) 
{ 
    std::string result; 

    if (stream.eof()) { 
    result = "Unexpected end of file."; 
    } 

#ifdef WIN32 
    // GetLastError() gives more details than errno. 
    else if (GetLastError() != 0) { 
    result = FormatSystemMessage(GetLastError()); 
    } 
#endif 

    else if (errno) { 
#if defined(__unix__) 
    // We use strerror_r because it's threadsafe. 
    // GNU's strerror_r returns a string and may ignore buffer completely. 
    char buffer[255]; 
    result = std::string(strerror_r(errno, buffer, sizeof(buffer))); 
#else 
    result = std::string(strerror(errno)); 
#endif 
    } 

    else { 
    result = "Unknown file error."; 
    } 

    boost::trim_right(result); // from Boost String Algorithms library 
    return result; 
}