Pregunta

Estoy creando un programa para copiar un archivo de texto. Tengo un archivo main.cpp que se lee en un archivo de texto dado por la matriz FileNamein y luego envío una copia del archivo de texto dado por la matriz FileNameOut. Tengo esta función declarada en mi fileutilidades.h como

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

Entonces el fileutilidades.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;
}

Cuando compilo esto, recibo una falla de afirmación visual de C. Obtengo un cuadro de diálogo titulado "Biblioteca de depuración de Microsoft Visual C ++" que contiene lo siguiente:

"¡Depuración de aserción!

Programa: ..... Parser.exe

Archivo F: DD VCTOOLS CRT_BLD SEGH_X86 CRT SRC FOPEN.C

Línea 53

Expresión: (archivo! = Null) "

Este error me da 3 opciones: abortar, volver a intentarlo. Abortar solo detiene la depuración. REIrry trae un mensaje en Visual Studio que dice "Program.exe ha activado un punto de interrupción". Si hago clic en Break aquí, Visual Studio abre un archivo llamado "fopen.c" y señala la línea 54 en este archivo.

Si continúo desde este punto, Visual Studio abre otro archivo llamado "dbghook.c" con un puntero a la línea 62.

¿Fue útil?

Solución

¿Dónde está el error? En fin o fout? Verifique el correspondiente filenameXX, no debe ser NULL

Otros consejos

O filenamein o filenameout Out es nulo, de ahí el error. Si utiliza std::string En lugar de cadenas C, no tendrá que preocuparse por los punteros nulos. Como ya está usando la biblioteca de E/S de C ++, realmente no hay razón para no usar std::string.

Dicho esto, su función también es incorrecta porque no verifica si el get() Llamada tuvo éxito antes de usar el carácter extraído. También regresas true, incluso si la copia falla a la mitad del archivo.

La siguiente es una implementación correcta de esta función (nota, sin embargo, que casi seguramente no es óptima; solo demuestra cómo escribir correctamente la función que tiene):

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top