示例代码: 需要头文件<sstream>
ifstream infile(m_simFilePath.c_str());//m_simFilePath是相似度矩阵所在的文件路径(成员变量)
if(!infile)//通过string类成员函数c_str()把string转换成c中的字符串样式:constchar*,infile函数的参数为const char*,'.c_str()'转化后的带有‘ ’结尾,'.data()'转化后的不带
{
cout<< "Unable to open the file: "<< m_simFilePath<< endl;
assert(false);
}
string line;
while(getline(infile,line))//getline第三个参数默认为终结符‘n’
{
stringstreamstrm(line);//string类型的line赋值给字符串流strm,空格换行指标都会被当做切分符,相当于stringstreamstrm;strm<<line;
intidx1 = 0;
int idx2 =0;
doublesim = DBL_MIN;
strm>> idx1>> idx2>> sim;//分隔成三个word? 这是啥意思???????????????????
S[idx1][idx2]= sim;
}
—————————————————————————————————————————————————
字符串处理:split类似功能
#include<string>
#include<sstream>
int num=0;
stringstr="aaaaaa_bbbbbbb_ccccccc";
for (inti=0;i<str.length();i++)
{
if (str[i]=='_')
{
num++; //num记录要分割成多少次
str[i]=' ';//stringstream只能拆分非空字符,所以用空格替换分隔字符
}
}
string *array=new string[num];//分割后的字符串就存在这里了
stringstream ss;
ss<<str;
for (intj=0;j<num;j++)
{
ss>>array[j];//以空白字符作为分隔符,分隔后保存到array
}
————————————————————————————————————————————————
字符串流又一应用,拆分句子,getline适用于任何输入流:
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim );
从网上download下一个page,保存为string型,then:
stringstream strm(page);
while(getline(strm,line))
。。。。。
总之,处理文本最好先拆分,不要用一个大循环,设置很多flag,很乱且调试非常恶心!