22. 编译期宏定义
选项:-Dmacro[=defn]
示例:
g++ main.cpp -o main -DKURO
Makefile:CXXFLAGS = -std=c++0x -g -Wall -Wno-unused -DKURO=88
21. 转码
21.1 iconv_open
函数:iconv_t iconv_open(const char *tocode, const char *fromcode);
功能:分配一个转换描述符,用于将字节序列从fromcode编码转换到tocode编码
头文件:#include <iconv.h>
参数:系统支持的fromcode和tocode的合法值及其组合,全部罗列于iconv --list的输出中
返回值:成功则返回转换描述符;失败则返回-1,并置错误码
说明:
① 一个转换描述符iconv_t不可同时用于多个线程
② 转换描述符iconv_t用完后,需调用关闭函数iconv_close()
21.2 iconv
函数:size_t iconv(iconv_t cd,
char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft);
功能:执行字符集转换
头文件:#include <iconv.h>
参数:
cd 转换描述符
inbuf 指向输入缓冲区首地址的指针
inbytesleft 表示输入缓冲区等待转换的字节个数
outbuf 指向输出缓冲区首地址的指针
outbytesleft 表示输出缓冲区中可用空间大小,字节个数
返回值:成功则返回转换的字符数;失败则返回-1,并置错误码
描述:
① 该函数从*inbuf读取多字节序列,将其转换成目标格式的多字节序列,并将结果存放在*outbuf
② *inbuf中至多*inbytesleft个字节将被读取,至多*outbytesleft个字节将被写入*outbuf
③ 一次转换一个字符,然后根据已转换的输入字节数,递增*inbuf,递减*inbytesleft;根据已转换的输出字节数,递增*outbuf,递减*outbytesleft
21.3 示例
说明:
① 因为iconv会递增*inbuf和*outbuf,因此需要使用临时变量
char *inbuf = (char*)ch;
char *outbuf = buf;
以保证原输入/输出缓冲区指针不变,即ch和buf值不改变。
② 函数执行结束后,inbuf和outbuf的值已改变,不再指向缓冲区首地址,所以获取转换结果,应使用buf,而不是outbuf
③ 转换过程,不会影响输入缓冲区中的原始内容,即ch中的内容不改变
20. 文件I/O
20.1 std::ifstream
打开
读取
20.2 std::ofstream
打开
写入
说明
① std::ofstream::app指定文件打开方式为追加,即从原文件内容的末尾开始写入;默认打开方式为截断,即删除原文件内容
② 文件路径可为绝对路径或相对路径,但不能使用「~」
19. C++11
19.1 shared_ptr
gcc 4.4
头文件:#include <tr1/memory>
使用:std::tr1::shared_ptr<T> shp;
说明:头文件位于目录/usr/include/c++/4.4.7/tr1
gcc 4.8
头文件:#include <memory>
Makefile:CXXFLAGS=-std=c++11
使用:std::shared_ptr<T> shp;
19.2 function与bind
gcc 4.4
头文件:#include <tr1/functional>
使用:std::tr1::function<> fn; std::tr1::bind(&Class::FnMem, &obj, std::tr1::placeholders::_1);
说明:头文件位于目录/usr/include/c++/4.4.7/tr1
gcc 4.8
头文件:#include<functional>
Makefile:CXXFLAGS=-std=c++11
使用:std::function<> fn; std::bind(&Class::FnMem, &obj, std::tr1::placeholders::_1);
19.3 auto
gcc 4.4
Makefile:CXXFLAGS=-std=c++0x
使用:auto pos = vector.begin();
gcc 4.8
Makefile:-std=c++11
使用:auto pos = vector.begin();
18. SIGPIPE
当一个进程向某个已收到RST的套接字执行写操作时,内核会向该进程发送一个SIGPIPE信号,该信号的默认行为是终止进程
不论进程是捕获了该信号并从其信号处理函数返回,还是简单地忽略该信号,写操作都将返回EPIPE错误
情景还原
现假设数据流向为A——>B
A和B位于两台主机,A发送数据,B给予应答,然后终止进程B
进程终止时,该进程打开的所有描述符都将被关闭,对于套接字描述符,即向对端发送FIN
FIN的作用是