Ошибка утверждения Visual C ++

Я создаю программу для копирования текстового файла. У меня есть файл main.cpp, который читает текстовый файл, заданный массивом filenamein, а затем выводит копию текстового файла, заданного массивом filenameout. у меня эта функция объявлена ​​в моем FileUtilities.h как

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

Тогда FileUtilities.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;
}

Когда я компилирую это, я получаю ошибку утверждения Visual C. Я получаю диалоговое окно под названием «Библиотека отладки Microsoft Visual C ++», в котором содержится следующее:

Ошибка отладки!

Программа: ..... Parser.exe

файл f: \ dd \ vctools \ crt_bld \ Self_x86 \ crt \ src \ fopen.c

Строка 53

Выражение: (файл! = NULL)

Эта ошибка дает мне 3 варианта: отменить, повторить или игнорировать. Отмена просто останавливает отладку. Retry вызывает сообщение в Visual Studio, в котором говорится, что program.exe инициировал точку останова. Если я щелкну здесь break, Visual Studio откроет файл с именем fopen.c и укажет на строку 54 в этом файле.

Если я продолжу с этого момента, Visual Studio откроет другой файл с именем dbghook.c с указателем на строку 62.


person Marc    schedule 30.04.2011    source источник
comment
ну, очевидно, filenamein или filenameout - это NULL-указатель .. Покажите нам, как вы вызываете textFileCopy.   -  person Kiril Kirov    schedule 01.05.2011
comment
вы должны копировать файл большими кусками, а не char за char.   -  person Nick Dandoulakis    schedule 01.05.2011


Ответы (2)


Где ошибка? На fin или fout? Отметьте соответствующий filenameXX, он не должен быть NULL

person Kiril Kirov    schedule 30.04.2011
comment
Я исправил это сейчас, имя файла было установлено на null в моем файле main.cpp. Спасибо - person Marc; 01.05.2011

Либо filenamein, либо filenameout out равно нулю, отсюда и ошибка. Если вы используете std::string вместо строк C, вам не придется беспокоиться о нулевых указателях. Поскольку вы уже используете библиотеку ввода-вывода C ++, на самом деле нет причин не использовать std::string.

Тем не менее, ваша функция также неверна, потому что вы не проверяете, был ли вызов get() успешным, прежде чем использовать извлеченный символ. Вы также возвращаете true, даже если копировать не удается на полпути к файлу.

Ниже приведена правильная реализация этой функции (обратите внимание, однако, что она почти наверняка не оптимальна; она просто демонстрирует, как правильно написать функцию, которая у вас есть):

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
person James McNellis    schedule 30.04.2011