C ++ wifstream:不兼容的类型char const *,wchar_t const *

时间:2015-01-08 13:03:39

标签: c++

我正在关注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
}

提前致谢。

2 个答案:

答案 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_strwstring传递给wstringconst charT*会返回{{1}}。这些类型不兼容。