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;
}
我在 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;
}