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

fichier

f: \ 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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top