我正在制作一个通用记录器类,它可以打印传递到文件中的任何内容。
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:
这是我的代码:
使用这个类就可以了:
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/