免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 922 | 回复: 0
打印 上一主题 下一主题

最近做开发时写的文件和字串处理函数.............. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-05 15:08 |只看该作者 |倒序浏览
可以轻松的处理文件的按行读入,和字串分割.
解决window和linux平台下因文件格式不同而导致的错误(EOF, '\r\n' '\n')问题.....
/*
*函数说明: 读入一个有效的行. 处理后这行的最前面和最后面的空白(' ' 和 '\t' 和'\r')都将被过滤掉.
*输入参数: 文件流对象引用,字符串引用
*输出参数: 保存在传入的字符串引用中
*函数返回: false = 读取文件结束....(文件结束概率是99.9%,剩下的出错情况应该和文件结尾一样的处理)
*   true  = 读到了一个有效的行  
*/
bool readline(ifstream& infile, string& textline)
{

while(getline(infile, textline, '\n'))
{
  int prev_pos = 0; //最开始有效字符位置.....
  int post_pos = 0; //最后有效字符位置....  
  //下面的循环语句可以用textline.find_first_not_of(filter,pos)来处理,出于效率考虑本处使用这样的算法.........
  while(textline[prev_pos] == ' ' || textline[prev_pos] == '\t' || textline[prev_pos] == '\r')//过滤开始空白
   prev_pos++;
  if(textline[prev_pos] == '\0')
   continue;//如果是空白行则再读一行进行处理.......
  else
  {
                   post_pos=textline.length()-1;
                   while(textline[post_pos] == ' ' || textline[post_pos] == '\t' || textline[post_pos] == '\r')//过滤最后的空白
                        {
                         post_pos--;
                        }
                   textline=textline.substr(prev_pos,post_pos+1-prev_pos);
   return true;//成功读取一有效行
  }
  
}
return false;//读到文件的末尾......
}
/*
*函数功能: 把一个字符串用空白(' ' 或 '\t')分割成一个单词序列. 本字符串应该是有rendline(...)读取后传入的参数,
    在本函数里面将不在进行字串最前面和最后面的过滤.(本函数假设传入的字符串是有效字串)
*输入参数: 存储单词序列的容器; 要分割的字串.
*输出参数: 单词序列
*函数返回: 无
*/
void splice(vector& words, string& textline)
{
int pos = 0;
int prev_pos = 0;
string filter(" \t");
while((pos = textline.find_first_of(filter, pos)) != string::npos)
{
  words.push_back(textline.substr(prev_pos, pos-prev_pos));
  pos = textline.find_first_not_of(filter, pos);
  prev_pos = pos;  
}
words.push_back(textline.substr(prev_pos, pos-prev_pos));
}
/*
*测试用例...................................................
*/
void test(void)
{
ifstream infile("cn24.txt");
string textline;
cout words;//做临时变量使用,当全局的时候在循环的最后words.resize()用缩小空间
  cout::iterator start = words.begin();
  vector::iterator end   = words.end();
  while(start != end)
  {
   cout

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/14053/showart_151237.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP