ofstream.open() 在 UWP 应用程序调用的 DLL 中设置 failbit

ofstream.open() set failbit in DLL called by UWP application

我在 Internet 上查找是否有人遇到过该问题,但没有发现任何问题。

所以我正在尝试在 C# UWP 应用程序中使用 C++ DLL。此 DLL 有一个日志文件,该文件在代码开头使用以下函数打开:

#include <string>
#include <iostream>

using namespace std;

int Logger::set(string file_name, bool clear_log) {
    _file_stream.exceptions(ofstream::failbit | ofstream::badbit);
    try {
        _file_stream.open(file_name, ios_base::out | (clear_log ? ios_base::trunc : ios_base::app));
    }
    catch (ofstream::failure) {
        return -1;
    }
    _file_stream << "";
    return 0;
}

这是记录器的代码class:

class Logger {
private:
    std::ofstream _file_stream;

public:
    Logger() {};
    ~Logger() { _file_stream.close(); };

    int set(std::string file_name, bool clear_log);
}

现在,当我在独立模式下使用 DLL 时,这段代码工作正常。但是当通过 UWP 应用程序调用时,open() 函数会抛出一个 ofstream::failure 异常:

ios_base::failbit set: iostream stream error

我一开始以为是UWP奇怪的访问权限策略,调试后file_name指向AppData中正确的package文件夹,所以在这里写一个文件应该没问题。

可能是什么问题?

编辑:我发现由于某种原因,C 文件API 可以正常工作。即以下代码成功创建文件:

#include <iostream>
using namespace std;

int Logger::set(string file_name, bool clear_log) {
    FILE* test = fopen(file_name.c_str(), clear_log ? "w" : "a");
    if(!test)
    {
        return -1;
    }
    fprintf(test, "");
    return 0;
}

经过一些更积极的调试后,我发现了自己。在代码之前的某个地方,对 ofstream::open 的类似(间接)调用没有失败:

ofstream out("out.txt", ios_base::trunc);

通过在正确的位置放置断点,我能够确定在那种情况下,打开模式的值(ios_base::trunc 参数)解析为 18(预期值),而它当使用三元运算符时,在有问题的情况下解析为奇怪的值 1594。

用 if-else 块替换三元运算符解决了问题:

int Logger::set(string file_name, bool clean_log) {
    _file_stream.exceptions(ofstream::failbit | ofstream::badbit);
    try
    {
        if (clean_log)
            _file_stream.open(file_name, ios_base::trunc);
        else
            _file_stream.open(file_name, ios_base::app);
    }
    catch (ofstream::failure)
    {
        return -1;
    }
    return 0;
}