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