C++ 模板化 ofstream 字符以十进制打印

标签 c++ windows visual-studio-2010

我正在制作一个通用记录器类,它可以打印传递到文件中的任何内容。

Logger::Instance()->write('c');
Logger::Instance()->write("this");
Logger::Instance()->write(5);

但是我遇到了一个问题:

char c = 't';
Logger::Instance()->write(c);

它打印十进制而不是 ascii:

116

字符串工作正常,但字符是唯一有问题的。

我的代码:

class Logger {
public:
    static Logger* Instance();
    bool open(string filename);
    template<typename T>
    void write(T data) {
        file << data;
    }
    bool close();

如果我制作一个特定于字符的打印功能:

void write(char data) {
    file << data;

它将打印该字符。不确定这里发生了什么。

编辑 1:

只是一个总结..那么为什么会打印数字:

void write(T data) {
    file << data;
}

这会打印出正确的 ascii:

void writeChar(char data) {
    file << data;
}

???

编辑2:

这是我的代码:

logger.h logger.cpp

使用这个类就可以了:

char c = 't';
Logger::Instance()->write(t);
Logger::Instance()->writeChar(t);

编辑3:

好吧..这是最后一个源文件。

[keyboardhook.cpp][3]
[keyboardhook.h][4]
[main.cpp][5]

[3]: http://pastebin.com/VEav4kfn
[4]: http://pastebin.com/yPwF17yg
[5]: http://pastebin.com/JwHz2NBe

看这里:

if(isdigit(c)) {
        Logger::Instance()->write((char) c);
        Logger::Instance()->writeChar(c);
    } else if(isalpha(c)) {
        if(!shift)
            Logger::Instance()->writeChar(tolower((char) c));
        else
            Logger::Instance()->writeChar((char) c);

Stackoverflow 不断将我的写作标记为“代码”,并且在保存时给我带来问题。.抱歉让您久等了。

最佳答案

我尝试了以下方法,它在 Visual C++ 2010 中运行良好(正如我所期望的):

#include <iostream>

struct Logger {
    template <typename T>
    void write(T data) {
        std::cout << data;
    }
};

int main() {
    Logger *log = new Logger;
    char c = 't';
    log->write(c);
    delete log;
}

也许你有一些自定义的operator<<这是导致你出现这种行为的原因吗?你能发布一个sscce

编辑:

为了供将来引用,以下是您的问题的 SSCCE 构成内容(基于您的完整代码):

#include <iostream>

struct Logger {
template <typename T>
    void write(T data) {
        std::cout << data;
    }
};

int main() {
    Logger *log = new Logger;
    char c = 't';
    log->write(tolower(c));
    delete log;
}

关键问题是tolower的签名是int tolower(int c) ,也就是说,它返回一个整数,而不是一个字符。因此,write<int>被调用,而不是 write<char> .

请记住 sscce 的重要性!您的问题没有包含导致问题的非常重要的代码。

关于C++ 模板化 ofstream 字符以十进制打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095578/

相关文章:

linux - 是否可以设置 GitLab Linux 服务器并在 Windows PC 上工作?

c# - 我可以使用哪些工具在 Visual Studio 2010 Professional Edition 中分析 .Net 应用程序

visual-studio - 我应该抑制 CA1062 : Validate arguments of public methods?

c++ - 找不到头文件错误

windows - GWT 导致 Eclipse 无法在 Windows XP 上启动

C++ 空和数组索引

c# - 不使用类 System.Windows.Forms.Form 创建一个窗口?

c# - 如何根据后面的输入添加更多的标签?

C++ while 循环和 for 循环不起作用

c++ - 我重载了运算符 > 但它仍然说没有运算符匹配操作数