作者sunkill (linux才是王道)
看板C_and_CPP
标题[分享] 我写了一支处理许功盖问题的程式
时间Sun Mar 19 13:32:48 2006
参考之前的相关文章和一个别人写的 function
综合自己的需求写出此程式
需要的人就拿去用
若有可以改进的地方请用力指正我
感激
/*
作者: Logo Guo
日期: 2006/03/19
环境: fedora core 3 linux / g++ 3.4.4
功能: 处理许功盖问题 透过此程式处理许功盖问题的档案
版本: 1.0
信箱:
[email protected]
*/
#include <iostream>
#include <fstream>
using namespace std;
int big5_code(unsigned char hb, unsigned char lb);
int main(int argc, char* argv[])
{
if(argc != 3)
{
cout << "说明: " << argv[0] << " [source file] [result file]" << endl;
exit(1);
}
else
{
ifstream fin(argv[1], ios::in);
if(!fin)
{
cout << "档案 " << argv[1] << " 开起失败或不存在" << endl;
exit(1);
}
ifstream fout(argv[2], ios::in);
if(fout)
{
fin.close();
fout.close();
cout << "档案 " << argv[2] << " 开起失败或已存在" << endl;
exit(1);
}
else
{
ofstream fout(argv[2], ios::out);
if(!fout)
{
fin.close();
cout << "档案 " << argv[2] << " 开起失败或已存在" << endl;
exit(1);
}
unsigned char ch1, ch2;
bool flag = false;
while(fin.peek() != EOF)
{
ch1 = fin.get();
if(fin.peek() == EOF) break;
ch2 = fin.get();
if(big5_code(ch1, ch2) && ch2 == '\\') flag = true;
if(flag)
{
fout << ch1 << ch2 << '\\';
flag = false;
continue;
}
fout.put(ch1);
fin.putback(ch2);
}
fout << endl;
}
fin.close();
fout.close();
}
cout << "处理完成 " << argv[1] << " -> " << argv[2] << endl;
return 0;
}
int big5_code(unsigned char hb, unsigned char lb)
{
int hadd,ladd;
unsigned int big5;
big5 = lb + (hb << 8);
if((lb <= 0x7e && lb >= 0x40 || lb <= 0xfe && lb >= 0xa1) && (big5 >= 0xa440
&& big5 <= 0xc67e || big5 <= 0xf9fe && big5 >= 0xc940))
{
hadd = (hb - 164) * 157;
ladd = (lb < 127) ? (lb - 64) : (lb - 161 + 63);
return 1;
}
return 0;
}
--
for(i=不懂;i!=了解;i++)
{
......
......
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.67.101.226
1F:推 drkkimo:可以参考参考:) 03/19 16:58
2F:推 drkkimo:不过记得新版的一些编译器 像VC 会自动处理许功盖是吗? 03/19 16:59
3F:推 UNARYvvv:VC 处理 source code 的时候,的确没有许功盖问题 03/19 17:15
4F:推 sunkill:所以我特别标出 g++ 03/19 20:15
5F:推 cutecpu:perl -ne 'print $& while(/[\xa4-\xf9]\x5c/g)' 输入档名 03/20 10:47
6F:→ cutecpu:单纯只是要把许功盖问题字输出的话,上面Perl程式应该也行 03/20 10:49