公告

联系我:我的126邮箱: billhsu。 Locations of visitors to this page
<2009年11月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

统计

  • 随笔 - 41
  • 文章 - 0
  • 评论 - 82
  • 引用 - 0

常用链接

留言簿(16)

随笔分类

随笔档案

相册

Game Dev

搜索

  •  

最新评论

阅读排行榜

评论排行榜

fstream那些事
感觉fstream有些地方设计的不太合理,不知道是bug还是那些牛X们故意这样的。

首先,fstream竟然在中文路径这种东西上不支持,网上也可以看到许多实现方法,但有的方法其实并不是太好。
我觉得这样做最简单:
setlocale(LC_ALL,"");//设置成当前语言环境
ofstream out(filename);//打开文件
setlocale(LC_CTYPE, 0);

还有,fstream的getline也有问题,对于那些\n \r 空行 什么的都没考虑,用起来会出错。
在网上看到一个函数可以完美解决这个问题:
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;//读到文档的末尾
}

我根据上面这个函数 重载了一个char* 版的:

bool readline(ifstream& infile, char* textline)
{
while(infile.getline(textline,32))
{
  
int prev_pos = 0//最开始有效字符位置
  int post_pos = 0//最后有效字符位置.  
  string str=textline;
  
//下面的循环语句能够用textline.find_first_not_of(filter,pos)来处理,出于效率考虑本处使用这样的算法
  while(str[prev_pos] == ' ' || str[prev_pos] == '\t' || str[prev_pos] == '\r')//过滤开始空白
   prev_pos++;
  
if(str[prev_pos] == '\0')
   
continue;//假如是空白行则再读一行进行处理
  else
  {
         post_pos
=str.length()-1;
        
while(str[post_pos] == ' ' || str[post_pos] == '\t' || str[post_pos] == '\r')//过滤最后的空白
         {
               post_pos
--;
         }
        
string str2=str.substr(prev_pos,post_pos+1-prev_pos);
         strcpy(textline,str2.c_str());
        

   return true;//成功读取一有效行
  }
}
return false;//读到文档的末尾
}


posted on 2010-03-27 18:37 Bill Hsu 阅读(1713) 评论(3)  编辑 收藏 引用 所属分类: C/C++

评论

# re: fstream那些事 2010-03-29 01:56 陈梓瀚(vczh)

人家说的是,在英语文化下,中文字符不是字,因此拒绝成为文件名。你把它转到了中文文化,那么中文字符就是字,因此就可以是文件名了。

这就是setlocale的意思,把你的电脑set到地球上的某个角落,那么就会分配符合该地方文化的一个合法字符表和字节存储的映射关系,黑话叫字符集……
  回复  更多评论    

# re: fstream那些事 2010-03-29 08:16 Bill Hsu

@陈梓瀚(vczh)
谢谢陈兄的指教哈
  回复  更多评论    

# re: fstream那些事 2010-03-29 11:33 溪流

希望未来 CRT 能够用统一编码。。。
  回复  更多评论    

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理