做识别的时候,发现使用HParse生成的wdnet中的中文是以八进制形式输出的,不方便阅读,遂写了个小程序,将文件中的八进制转义输出。
C++在的文件流是在读取时不支持转义,因为它单纯的以字符形式读入,如\326,它在读入的时候是识别成四个字符,而不是一个。因此需要将此八进制读入后转为十进制再输出。
代码如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
char convertToDec(string slice)
{
return (char)((slice[0] - '0')*64
+ (slice[1] - '0')*8 + (slice[2] - '0'));
}
void convertEsc(ofstream &fout, string str)
{
for ( size_t i = 0; i < str.length(); ++i )
{
if ( '\\' == str[i] )
{
string temp = str.substr(i+1, 3);
i += 3;
fout << convertToDec(temp);
}
else
{
fout << str[i];
}
}
fout << endl;
}
int main(int argc, char **argv)
{
if ( argc < 3 )
{
cerr << "[in] [out]" << endl;
return 1;
}
ifstream fin( argv[1] );
if ( !fin )
{
cerr << "Cannot not open file: " << argv[1] << endl;
return 1;
}
string line;
ofstream fout( argv[2] );
while ( getline( fin, line ) )
{
convertEsc(fout, line);
}
fin.close();
fout.close();
return 0;
}
代码说明:
首先读入检索字符串的转义符'\',检索到此符号后,开始就算接下来的八进制的十进制结果,然后强制以char形式输出。