Вопрос

Я создаю программу для копирования текстового файла.У меня есть 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top