échec d'assertion Visual C ++
Question
Je crée un programme pour copier un fichier texte. J'ai un fichier main.cpp qui se lit dans un fichier texte donné par le tableau de filenamein puis sortie une copie du fichier texte donné par le tableau de filenameout. J'ai cette fonction déclarée dans mon FileUtilities.h comme
bool textFileCopy(char filenamein[], char filenameout[]);
Alors le FileUtilities.cpp contient
#include <iostream>
#include <fstream>
#include <string>
#include "FileUtilities.h"
bool FileUtilities::textFileCopy(char filenamein[], char filenameout[])
{
ifstream fin(filenamein);
if(fin.is_open())
{
ofstream fout(filenameout);
char c;
while(fin.good())
{
fin.get(c);
fout << c;
}
fout.close();
fin.close();
return true;
}
return false;
}
Quand je compile ce que je reçois un échec d'assertion Visual C. Je reçois une boîte de dialogue intitulée « bibliothèque de débogage Microsoft Visual C ++ » qui contient les éléments suivants:
"Debug Assertion Échec!
Programme: ..... Parser.exe
fichierf: \ jj \ vctools \ crt_bld \ Self_x86 \ crt \ src \ fopen.c
Ligne 53
Expression: (! File = NULL) "
Cette erreur me donne 3 options: Abandonner, Réessayer ou Ignorer. Abandonner juste arrête le débogage. Retry affiche un message dans Visual Studio qui dit « program.exe a déclenché un point d'arrêt ». Si je clique ici casser Visual Studio ouvre un fichier appelé « fopen.c » et les points à la ligne 54 dans ce fichier.
Si je continue de ce point de Visual Studio ouvre un autre fichier appelé "dbghook.c" avec un pointeur à la ligne 62.
La solution
Où est l'erreur? Sur fin
ou fout
? Vérifiez la filenameXX
correspondante, il ne doit pas être NULL
Autres conseils
Soit filenamein
ou filenameout
out est nul, d'où l'erreur. Si vous utilisez std::string
au lieu de chaînes C, vous ne serez pas à vous soucier de pointeurs nuls. Puisque vous utilisez déjà la bibliothèque E / S C ++, il n'y a vraiment aucune raison de ne pas utiliser std::string
.
Cela dit, votre fonction est incorrecte parce que vous ne cochez pas si l'appel a réussi get()
avant d'utiliser le caractère extrait. Vous revenez également true
, même si la copie échoue en partie dans le fichier.
Ce qui suit est une mise en œuvre correcte de cette fonction (note, cependant, qu'il est presque certainement pas optimale, il démontre à quel point écrire correctement la fonction que vous avez):
bool textFileCopy(std::string filenamein, std::string filenameout)
{
// Open the input stream
std::ifstream in(filenamein.c_str());
if (!in)
return false;
// Open the output stream
std::ofstream out(filenameout.c_str());
if (!out)
return false;
// Do the copy
char c;
while (in.get(c) && out.put(c));
// Ensure that the whole file was copied successfully
return in.eof() && out;
} // The input and output streams are closed when the function returns