Frage

Ich erstelle ein Programm, um eine Textdatei zu kopieren. Ich habe eine Main.cpp -Datei, die in einer vom DateinameIn -Array angegebenen Textdatei liest und dann eine Kopie der vom Dateinameout -Array angegebenen Textdatei ausgibt. Ich habe diese Funktion in meinen FileUtilities.h als deklariert

bool textFileCopy(char filenamein[], char filenameout[]);

Dann enthält die DateiUtilities.cpp

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

Wenn ich dies kompiliere, bekomme ich einen visuellen C -Behauptungsversagen. Ich erhalte ein Dialogfeld mit dem Titel "Microsoft Visual C ++ Debugbibliothek", das Folgendes enthält:

"Debug-Assertion fehlgeschlagen!

Programm: ..... Parser.exe

Datei f: dd vctools crt_bld self_x86 crt src fopen.c

Zeile 53

Ausdruck: (Datei! = Null) "

Dieser Fehler gibt mir 3 Optionen: Abbruch, Wiederholung oder ignorieren. Abort stoppt einfach das Debuggen. Wiederholung bringt eine Nachricht in Visual Studio auf, in der "Programm.exe einen Haltepunkt ausgelöst hat". Wenn ich hier klicke, öffnet Visual Studio eine Datei namens "fopen.c" und verweist in dieser Datei auf Zeile 54.

Wenn ich von diesem Punkt aus fortgegangen bin, öffnet Visual Studio eine andere Datei namens "dbghook.c" mit einem Zeiger auf Zeile 62.

War es hilfreich?

Lösung

Wo ist der Fehler? An fin oder fout? Überprüfen Sie die entsprechenden filenameXX, es darf nicht sein NULL

Andere Tipps

Entweder filenamein oder filenameout Out ist null, daher der Fehler. Wenn du benutzt std::string Anstelle von C -Streichern müssen Sie sich keine Sorgen um Nullzeiger machen. Da Sie bereits die C ++ - E/A -Bibliothek verwenden, gibt es wirklich keinen Grund, nicht zu verwenden std::string.

Trotzdem ist Ihre Funktion auch falsch, da Sie nicht prüfen, ob die get() Call erfolgreich, bevor Sie das extrahierte Zeichen verwenden. Sie kehren auch zurück true, Auch wenn die Kopie den Teil durch die Datei fehlschlägt.

Das Folgende ist eine korrekte Implementierung dieser Funktion (beachten Sie jedoch, dass sie fast sicher nicht optimal ist; sie zeigt nur, wie Sie die Funktion, die Sie haben, richtig schreiben):

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top