Ошибка утверждения Visual C ++ - PullRequest
0 голосов
/ 01 мая 2011

Я создаю программу для копирования текстового файла. У меня есть файл 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

Выражение: (file! = NULL) "

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

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

Ответы [ 2 ]

3 голосов
/ 01 мая 2011

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

2 голосов
/ 01 мая 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...