【问题标题】:Visual C++ assertion failureVisual C++ 断言失败
【发布时间】:2011-04-30 20:32:12
【问题描述】:

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

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

【问题讨论】:

  • 嗯,很明显,filenameinfilenameout 是 NULL 指针。告诉我们你如何称呼 textFileCopy
  • 你应该大块复制文件,而不是一个字符一个字符。

标签: c++ assertion


【解决方案1】:

哪里出错了?在finfout 上?勾选对应的filenameXX,一定不是NULL

【讨论】:

  • 我现在修复了它,文件名在我的 main.cpp 文件中设置为 null。谢谢
【解决方案2】:

filenameinfilenameout out 为空,因此出现错误。如果您使用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

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多