0

我正在创建一个复制文本文件的程序。我有一个 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 个选项:Abort、Retry 或 Ignore。中止只是停止调试。重试会在 Visual Studio 中显示一条消息,显示“program.exe 已触发断点”。如果我在此处单击 break,Visual Studio 将打开一个名为“fopen.c”的文件并指向该文件中的第 54 行。

如果我从这一点继续,Visual Studio 会打开另一个名为“dbgook.c”的文件,其中包含指向第 62 行的指针。

4

2 回答 2

3

错误在哪里?开finfout?检查对应的filenameXX,一定不是NULL

于 2011-04-30T20:36:44.897 回答
2

要么filenameinfilenameoutout 为空,因此错误。如果您使用std::string而不是 C 字符串,则不必担心空指针。由于您已经在使用 C++ I/O 库,因此没有理由不使用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
于 2011-04-30T20:59:42.563 回答