C++:有没有什么好的读/写方法而不用在函数名中特别说明字符类型? (cout 与 wcout 等)

标签 c++ file-io stream wchar-t

我在让程序根据模板从文件中读取时遇到问题,例如:

bool parse(basic_ifstream<T> &file)
{
    T ch;
    locale loc = file.getloc();
    basic_string<T> buf;
    file.unsetf(ios_base::skipws);
    if (file.is_open())
    {
        while (file >> ch)
        {
            if(isalnum(ch, loc))
            {
                buf += ch;
            }
            else if(!buf.empty())
            {
                addWord(buf);
                buf.clear();
            }
        }
        if(!buf.empty())
        {
            addWord(buf);
        }
        return true;
    }
    return false;
}

当我用 <char> 实例化此类时,这将起作用, 但在使用 <wchar_t> 时出现问题(很明显)。

课外,我正在使用:

for (iter = mp.begin(); iter != mp.end(); ++iter )
{
    cout << iter->first << setw(textwidth - iter->first.length() + 1);
    cout << " " << iter->second << endl;
}

要写入此数据结构中的所有信息(它是 map<basic_string<T>, int> ),并且如预期的那样,如果 iter->first 则 cout 爆炸不是 char数组。

我在网上看过,一致认为是使用 wcout,但不幸的是,由于该程序要求可以在编译时更改模板 ( <char> -> <wchar_t> ),我不确定我该怎么做只需选择 cout 或 wcout 即可。也就是说,除非有一种方法可以在不更改大量代码的情况下读取/写入宽字符。

如果这个解释听起来复杂得令人尴尬,请告诉我,我会尽力解决。

最佳答案

使用特征类。您无需在代码中直接引用 cout,而是引用 traits<T>::cout然后专攻traits<char>到 std::cout 和 traits<wchar_t>想知道。

已更新

template <typename T>
class traits {
public:
    static std::basic_ostream<T>& tout;
};

template<>
std::ostream& traits<char>::tout = std::cout;

template<>
std::wostream& traits<wchar_t>::tout = std::wcout;

int _tmain(int argc, _TCHAR* argv[])
{
    traits<char>::tout<<"Ascii";
    traits<wchar_t>::tout<<L"Unicode";
    return 0;
}

关于C++:有没有什么好的读/写方法而不用在函数名中特别说明字符类型? (cout 与 wcout 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2458806/

相关文章:

c++ - 计算 Viola-Jones 人脸检测中的置信因子?

c++ - 为什么它不会进入无限循环

java - 遇到这段代码,我想知道为什么需要这个静态辅助方法?

c - 关闭和打开二进制文件时读取它

c++ - Arduino:Serial.find(char) 不工作

c++ - 服务器管理软件如何工作?

c++ - 系统未在范围内声明?

java - 如何在 Java 5 中从文本文件中读取时间和日期?

flutter - Flutter BLoC(flutter_bloc)是否与onDispose等效?

node.js - 将写入流中的文件直接传输到客户端作为在 Node.js 中下载