该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。
其教学视频见:[C++高级教程]从零开始开发服务器框架(sylar)
上一篇:C++服务器框架开发4——日志系统logger/.cpp与.cc
C++服务器框架开发5——日志系统logAppender/IO类“3种stream”/双感叹号
- 目前进度
- IO类(3种stream)
- iostream:控制台输入输出。
- stringstream:string的输入输出
- fstream:文件相关的输入输出
- 双感叹号
目前进度
目前学习到第三个视频,视频up对log.h中的logAppender的两个子类进行了定义。
要点:
- log.h中的LogAppend类,声明了1个m_formatter成员(因为可能数据格式会有多种,所以定义了这个成员)、1个设置m_formatter的函数setFormatter、1个获得m_formatter的函数getFormatter。
-
导入了两个头文件。
注:这里的#include <stringstream>
应该是写错了,应该是#include <sstream>
-
log.h中的输出到控制台的Appender:stdoutLogAppender与输出到文件的Appender:FileLogAppender。其中,后者有成员变量,分别是文件名m_filename、和文件流m_filestream。还有一个reopen函数。
-
log.cc中对几个函数做了定义。其中,从reopen函数的定义可以看到,如果文件被打开了,则先关闭,然后再打开。这个的返回值有双感叹号,下一小节会介绍是什么意思。
IO类(3种stream)
参考自文章1和文章2
iostream:控制台输入输出。
#ifndef __HELLOWORLD__
#define __HELLOWORLD__
#include <iostream>
#endif
int main() {
int a;
std::cin >> a;//从控制台接收输入并保存在a中
std::cout << a;//把a的值输出到控制台 //sp不再持有任何指针(空指针)
return 0;
}
输入了1,返回来1
stringstream:string的输入输出
#ifndef __HELLOWORLD__
#define __HELLOWORLD__
#include<iostream>
#include<sstream>//上面图片2中up写错了,应该导入sstream而不是stringstream
#include<string>
#endif
int main() {
std::string b="6789";
std::istringstream a(b); //将a和string类型的b相关联
std::string c;
while (a >> c) //a从b中读取东西并保存在c中(从a往c“扔”东西)
std::cout<<a.str(); //调用str()函数将a的内容输出看看
std::ostringstream d;
d << "abcdefg"; //将字符串保存到d中(“扔”到d里面)
std::cout << d.str(); //调用str()函数将d的内容输出看看
return 0;
}
fstream:文件相关的输入输出
#ifndef __HELLOWORLD__
#define __HELLOWORLD__
#include<iostream>
#include<fstream>
#include<string>
#endif
int main() {
// writing on a text file
std::ofstream out("out.txt");
std::cout << !!out << std::endl;
if (out.is_open())
{
out << "This is a line.\n";
out << "This is another line.\n";
out.close();
std::cout << "Finished writing" << std::endl;
}
// reading a text file
char buffer[256];
std::ifstream in("test.txt");
std::cout << !!in << std::endl;
if (!in.is_open())
{
std::cout << "Error opening file"; exit(1);
}
while (!in.eof())
{
in.getline(buffer, 100);
std::cout << buffer << std::endl;
}
return 0;
}
双感叹号
日志系统中的reopen函数最后将ofstream流加了双感叹号作为返回值,我在上面关于fstream的代码中直接将他输出到控制台,可以看到,正常打开的话,会输出1。
双感叹是为了将变量值转换为逻辑值,因为非零是true,零为false,所以用双感叹号就可以实现这一点。单感叹号和双感叹号的效果如下:
#ifndef __HELLOWORLD__
#define __HELLOWORLD__
#include<iostream>
#endif
int main() {
//取反
std::cout << !(0) << std::endl;
std::cout << !(1) << std::endl;
//非零为1,零为0
std::cout << !!(0) << std::endl;
std::cout << !!(2) << std::endl;
return 0;
}