感覺fstream有些地方設(shè)計(jì)的不太合理,不知道是bug還是那些牛X們故意這樣的。
首先,fstream竟然在中文路徑這種東西上不支持,網(wǎng)上也可以看到許多實(shí)現(xiàn)方法,但有的方法其實(shí)并不是太好。
我覺得這樣做最簡單:
setlocale(LC_ALL,"");//設(shè)置成當(dāng)前語言環(huán)境
ofstream?out(filename);//打開文件
setlocale(LC_CTYPE,?0);
還有,fstream的getline也有問題,對于那些\n \r 空行 什么的都沒考慮,用起來會出錯。
在網(wǎng)上看到一個函數(shù)可以完美解決這個問題:
bool?readline(ifstream&?infile,?string&?textline)
{
while(getline(infile,?textline,?'\n'))
{
??int?prev_pos?=?0;?//最開始有效字符位置.
??int?post_pos?=?0;?//最后有效字符位置
??//下面的循環(huán)語句能夠用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;//假如是空白行則再讀一行進(jìn)行處理.
??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;//讀到文檔的末尾
}
我根據(jù)上面這個函數(shù) 重載了一個char* 版的:
bool?readline(ifstream&?infile,?char*?textline)
{
while(infile.getline(textline,32))
{
??int?prev_pos?=?0;?//最開始有效字符位置
??int?post_pos?=?0;?//最后有效字符位置.??
??string?str=textline;
??//下面的循環(huán)語句能夠用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;//假如是空白行則再讀一行進(jìn)行處理
??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;//讀到文檔的末尾
}