c++ 为什么这个.c_str()看起来损坏了,为什么它输出奇怪的字符?

6pp0gazn  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(118)

我正在尝试使用FuzzyLite C库加载.fis文件并在C代码中使用它。我使用的是C++ 14、Visual Studio 17.5.0和Visual C++ 2022。
按照入门指南,它将是:

#include <iostream>
#include <fl/Headers.h>
#include <fstream>

int main()
{
    const std::string filePath = "C:\\Users\\me\\fuzzyLogic\\rules.fis";

    fl::Engine* engine = new fl::Engine;

    try
    {
        engine = fl::FisImporter().fromFile(filePath);
    }
    catch (fl::Exception& e)
    {
        std::cerr << e.what() << std::endl; 
    }

    std::string status;
    if (not engine->isReady(&status))
        throw Exception("[engine error] engine is not ready:n" + status, FL_AT);
    else 
        std::cout << "ok" << std::endl;
}

我下载了完整的库源代码,并使用build.bat在发布模式下编译它。然后尝试运行上面的代码,但得到了错误:

[file error] file <> could not be opened
{at \src\imex\Importer.cpp::fl::Importer::fromFile() [line:31]}

Visual Studio debugger会抛出以下命令:

Exception thrown at 0x00007FFD5C55FE7C in FuzzyLiteTest.exe: Microsoft C++ exception: fl::Exception at memory location 0x0000009F9539F5B0.
Exception thrown: read access violation.
**_Pnext** was 0xFFFFFFFFFFFFFFFF.

然后我在第31行打开Importer.cpp,它正在检查是否可以从路径打开读取器:

Engine* Importer::fromFile(const std::string& path) const {
        std::ifstream reader(path.c_str());
        if (not reader.is_open()) {
            throw Exception("[file error] file <" + path + "> could not be opened", FL_AT);
        }
        std::ostringstream textEngine;
        std::string line;
        while (std::getline(reader, line)) {
            textEngine << line << std::endl;
        }
        reader.close();
        return fromString(textEngine.str());
}

好吧,我想我应该尝试以下方法:

  • 使用字符串文字作为文件路径:没有用。
  • 使用相对文件路径:没有用。
  • 与文件路径相关的任何内容都不起作用,因为文件是好的,我可以使用其他任何东西(如fstream)访问其内容。

所以我修改了Importer来输出它接收到的字符串:

Engine* Importer::fromFile(const std::string& path) const {
        std::cout << "path: " << path << '\n';
        std::cout << "path.c_str(): " << path.c_str() << '\n';
        std::ifstream reader(path.c_str());
        if (not reader.is_open()) {
            throw Exception("[file error] file <" + path + "> could not be opened", FL_AT);
        }
        std::ostringstream textEngine;
        std::string line;
        while (std::getline(reader, line)) {
            textEngine << line << std::endl;
        }
        reader.close();
        return fromString(textEngine.str());
}

重新构建了库,我尝试再次运行。然后得到以下输出:

path:
path.c_str(): ©÷9òƒ
[file error] file <> could not be opened
{at \src\imex\Importer.cpp::fl::Importer::fromFile() [line:33]}

它看起来损坏或类似的东西。我试图在源文件中搜索,但找不到任何地方的路径被传递到以及。任何线索?这是我做的事情吗?

snvhrwxg

snvhrwxg1#

我发现了问题:不兼容的项目和库配置。我使用的是在发布模式下编译的库,而我的项目处于调试模式。它们需要处于相同的模式。
更多信息:here

相关问题