C++ wifstream:不兼容的字符常量*,wchar_t康斯特*类型
C++ wifstream: Incompatible type char const*, wchar_t const*
我在这里遵循DirectX 3D模型加载教程,并且正在测试代码的一小部分。要加载我的 .obj 文件,我需要使用宽文件流,并且教程提示初始化一个新流,我需要传入宽字符串。
我有点偏离教程,因为我希望将演示的串行实现转换为简洁的 OO 包,但是当我尝试初始化我的 file
变量进行读取时,我遇到了incompatible type char const* to wchar_t const*
错误
如何解决此问题?
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
}
提前谢谢。
首先,您正在尝试分配一个流,但您无法这样做。流不是容器,而是数据流。因此,它们不能被复制或分配给。相反,您可以使用流对象的open
成员函数:
class Stream {
private:
std::wifstream file;
public:
bool open_file(std::wstring &filename) {
file.open(filename.c_str());
}
};
然后我们回到文件名的问题。您正在阅读的教程是错误的。以下重载可用于所有basic_ifstream
实例化:
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
。
本教程很可能基于 Microsoft 标准库实现提供的非标准扩展做出了假设,这增加了占用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();
}
};
std::wifstream
在其构造函数中采用const char*
。 您不能将c_str
从wstring
传递给它,因为wstring
会返回const charT*
。 这些类型不兼容。
相关文章:
- 康斯特指针C++斯特劳斯特鲁普
- Static_cast 对于康斯特来说,会抛弃预选赛
- 东康斯泰克普/康斯蒂尼特/康斯特瓦尔在C++20 中允许吗?
- 康斯特正确性建议
- 从字符到康斯特* 字符的转换无效,代码有什么问题?
- T*上的部分排序...和康斯特·
- 调用"树:<int>:运算符==(树*&<int><int>,树*&)康斯特"没有匹配函数
- 抛弃康斯特,就是这种定义明确的行为
- 错误:类型为 '.&' 来自类型的临时 '..*康斯特'
- 无法push_back移动(不可复制与康斯特字段)到矢量
- 传递康斯特字符*的值
- mpg123_open()和康斯特
- 康斯特指针浅拷贝
- C++ wifstream:不兼容的字符常量*,wchar_t康斯特*类型
- 康斯特是谎言吗?(因为康斯特可以被抛弃)
- 康斯特·查尔 * 变得腐败
- 康斯特查尔..改变
- 康斯特与 #define(奇怪的行为)
- 这是抛弃康斯特吗?
- 第二个康斯特在"const int const &someval"做什么?