该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。
其教学视频见:[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 filestd::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 filechar 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,零为0std::cout << !!(0) << std::endl;std::cout << !!(2) << std::endl;return 0;
}