fstream那些事

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 ; // 读到文档的末尾
}


你可能感兴趣的:(fstream那些事)