2009-11-12 8 views
2

Je suis en train d'ouvrir un fichier de sortie que je suis sûr a un nom unique, mais il échoue de temps en temps. Je n'ai trouvé aucune information pour quelles raisons le constructeur ofstream échouerait.Pourquoi ofstream ne parviendrait pas à ouvrir le fichier en C++? Les raisons?

EDIT: Il commence à échouer à un certain moment et après qu'il échoue en permanence jusqu'à ce que j'arrête le programme en cours qui écrire ce fichier.

EDIT: temps en temps = 22-24 heures

extrait de code (je ne pas aider mais encore quelqu'un a demandé pour elle)

ofstream theFile(sLocalFile.c_str(), ios::binary | ios::out); 
if (theFile.fail()) 
{ 
    std::string sErr = " failed to open "; 
    sErr += sLocalFile; 
    log_message(sErr); 
    return FILE_OPEN_FAILED; 
} 
+0

Define "de temps en temps." – Alex

+10

@windfinder: 'while (true) {fail(); Pause; } '. –

+0

Que voulez-vous dire par nom unique? utilisez-vous le _tmpfile ou une autre méthode pour générer un nom de fichier unique? Est-ce pour les fenêtres? – Matt

Répondre

10

Trop de manipulations de fichiers? En dehors de l'espace? Accès refusé? Problème de lecteur réseau intermittent? Le fichier existe déjà? Fichier verrouillé? C'est terriblement difficile à dire sans plus de détails. Edit: Sur la base des informations supplémentaires que vous avez données, il semble que vous pourriez avoir une fuite de descripteurs de fichiers (fichiers d'ouverture et de ne pas les fermer et ainsi à court d'une limite de poignée fichier par processus).

Je suppose que vous connaissez le exceptions method pour déterminer si les échecs iostream sont communiqués en tant qu'exceptions ou indicateurs d'état.

Dans mon expérience, les cours iostream donnent très peu de détails sur ce qui a mal tourné quand ils échouent lors d'une opération d'E/S. Toutefois, étant donné qu'ils sont généralement implémentés à l'aide de fonctions d'API Standard C et OS de niveau inférieur, vous pouvez souvent obtenir le code d'erreur C ou OS sous-jacent pour plus de détails. J'ai eu de la chance en utilisant la fonction suivante pour le faire.

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; 
} 
2

Vous pourriez être en de l'espace, ou il pourrait y avoir un problème d'autorisation. Le système d'exploitation peut également avoir verrouillé le fichier. Essayez un nom/chemin différent pour les coups de pied et voyez si cela fonctionne alors.

+0

hey stephan, merci. il commence à échouer à un certain point de temps et après cela, il cont. échoue jusqu'à ce que j'arrête le programme en cours d'exécution qui écrit ce fichier. Je vais vérifier les problèmes d'espace et de permissions pour être sûr. –

1

Une possibilité est que vous ayez une autre instance du même programme en cours d'exécution. Une autre est que peut-être vous exécutez deux instances (à des fins de débogage?) Les unes après les autres, et le système d'exploitation n'a pas fini de fermer le fichier et de réinitialiser les verrous avant que votre prochaine instance du programme arrive et le demande .

Questions connexes