Domanda

Sto creando un programma per copiare un file di testo. Ho un file main.cpp che legge in un file di testo fornito dall'array di fileNamein e quindi emette una copia del file di testo fornito dall'array filenameout. Ho questa funzione dichiarata nella mia fileutilities.h come

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

Quindi FileUtilities.cpp contiene

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

Quando compilo questo ricevo un fallimento di asserzione C. Ottengo una finestra di dialogo intitolata "Microsoft Visual C ++ Debug Library" che contiene quanto segue:

"L'affermazione del debug non è riuscita!

Programma: ..... parser.exe

File F: dd vctools crt_bld self_x86 crt src fopen.c

Riga 53

Espressione: (file! = Null) "

Questo errore mi dà 3 opzioni: interrompere, riprovare o ignorare. Abort interrompe il debug. Retry fa emergere un messaggio in Visual Studio che afferma che "Program.exe ha attivato un punto di interruzione". Se faccio clic su Break Here Visual Studio apre un file chiamato "Fopen.c" e punta alla riga 54 in questo file.

Se continuo da questo punto Visual Studio apre un altro file chiamato "dbghook.c" con un puntatore alla riga 62.

È stato utile?

Soluzione

Dov'è l'errore? SU fin o fout? Controllare il corrispondente filenameXX, non deve essere NULL

Altri suggerimenti

O filenamein o filenameout fuori è nullo, da cui l'errore. Se usi std::string Invece di stringhe C, non dovrai preoccuparti dei suggerimenti nulli. Dato che stai già usando la libreria I/O C ++, non c'è davvero motivo di non usare std::string.

Detto questo, anche la tua funzione non è corretta perché non controlli se il get() Call è riuscito prima di usare il carattere estratto. Torni anche true, anche se la copia fallisce a parte il file.

Di seguito è riportata una corretta implementazione di questa funzione (Nota, tuttavia, che quasi non è sicuramente ottimale; dimostra solo come scrivere correttamente la funzione che hai):

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top