我正在关注DirectX 3D模型加载教程here,并且我正在测试代码的一小部分。要加载我的.obj文件,我需要使用一个宽文件流,教程提示初始化我需要传入一个宽字符串的新流。
我已经偏离了教程,因为我希望将演示的串行实现转换为一个整洁的OO包,但是当我尝试初始化incompatible type char const* to wchar_t const*
变量时,我收到file
错误读
如何解决此问题?
class Stream {
private:
std::wifstream file;
public:
bool open_file(std::wstring &filename) {
file = std::wifstream(filename.c_str()); // error thrown here.
}
};
从main。
调用open
函数
std::wstring filename = "test_read.txt";
if(d.open_file(filename))
{
// Do read processing here
}
提前致谢。
答案 0 :(得分:2)
首先,您正在尝试分配流,而您无法做到这一点。流不是容器,而是数据流。因此无法复制或分配它们。相反,您可以使用流对象的open
成员函数:
class Stream {
private:
std::wifstream file;
public:
bool open_file(std::wstring &filename) {
file.open(filename.c_str());
}
};
然后我们回到文件名的问题。您正在阅读的教程错误。
The following overloads are available for all basic_ifstream
instantiations:
void open( const char *filename,
ios_base::openmode mode = ios_base::in );
void open( const std::string &filename,
ios_base::openmode mode = ios_base::in );
也就是说,无论流的CharT
如何,都只接受诚实的const char*
和std::string
文件名。
本教程很可能基于non-standard extensions provided by Microsoft's standard library implementation进行了假设,这增加了const wchar_t*
的重载。如果您希望编写可移植代码,请忽略这些重载。
最后,您目前没有从open_file
返回任何内容,这会导致未定义的行为。
您的更正后的代码应如下所示:
class Stream {
private:
std::wifstream file;
public:
bool open_file(const std::string& filename) {
file.open(filename); // file.open(filename.c_str()) in C++03
return file.is_open();
}
};
答案 1 :(得分:2)
std::wifstream
在其构造函数中使用const char*
。您无法将c_str
从wstring
传递给wstring
,const charT*
会返回{{1}}。这些类型不兼容。