Ошибка утверждения 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 варианта:Прервать, Повторить попытку или Проигнорировать.Прерывание просто останавливает отладку.При повторной попытке в Visual Studio появляется сообщение, в котором говорится "program.exe сработала точка останова".Если я нажму здесь break, Visual Studio откроет файл с именем "fopen.c" и укажет на строку 54 в этом файле.
Если я продолжу с этого момента, Visual Studio откроет другой файл с именем "dbghook.c" с указателем на строку 62.
Решение
В чем ошибка?Вкл . fin
или fout
?Проверьте соответствующие filenameXX
, этого не должно быть NULL
Другие советы
Либо 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