字符串的subtr()方法和find()方法总结和扩展应用(除去字符中不要的部分,控制字符串的内容)
介绍:
由于subtr()和find()都是字符串即string类中的方法,因此只有string的对象才可以调用,包括字符型数组和字符指针都不能调用
一、subtr()方法
该方法用来进行字符串的切割,方法需要传递两个参数,一个参数时切割的起始位置,一个参数时切割的结束位置(从起始位置开始包含起始位置,到结束位置结束不包含结束位置,到结束位置的前一个位置,前包后不包)
//substr介绍(返回局部字符串) string t = "qwer"; string copy = t.substr(0,1);!!!!返回q !!!!! //从第一个参数的位置到第二个参数的位置(前包后不包)
二、find()方法
用来进行字符串中局部字符或局部字符串的查找,方法返回一个位置(int)
//find介绍(返回位置即数字) string d = "qwer"; cout << d.find('q');//第一种形式,将字符作为函数参数,返回字符在字符串中所在的位置 cout << d.find("qw");//第二种形式,将字符串作为函数参数,返回代查字符串在原来字符串中的位置,也是代差字符串的第一个字符在原字符串的位置 cout << d.find("s");///当不存在时,返回4294967295 cout << d.find("r",3);//第三种形式,多加一个参数表示从原字符串的该位置开始进行查看,即为d[3]的位置往后查是否存在待查字符串
三、subtr()方法和find()方法在文本数据输入时的妙用
两个方法搭配可以完成对于一行数据的选择性读入,既可以巧妙的去除逗号,又可以选取每行局部的数据,而非将一行作为一整个字符串读入。
1、设置一个Begin变量记录读取的首位置
2、再设置一个End变量记录读取的结束位置
3、find()方法查找到分隔位置
4、想读取分割位置之前的位置:substr(Begin,(find()-Begin))
5、想读取分隔符之后的位置,再调用find()查找下一个分割位置如逗号、分号、换行符、空格等等
6、substr(Begin,(find()-Begin))以此类推
//该案例时读入
#include <iostream> #include <fstream> #include <string> #include <map> #include <stdlib.h> #include <iomanip> #include <vector> using namespace std; struct Polyline { double x = 0; double y = 0; //vector<float> xx; //vector<float> yy; }; int main() { struct Polyline P; double argv=0; int Begin, End; string count; string X, Y; static char num = 0; ifstream inFile; ofstream outFile; //ofstream outFile1; string a; string m; string Line; inFile.open("C:/digital_mapping/polyline.txt"); //打开文件用于读取数据。如果文件不存在,则打开出错。 if (!inFile.is_open()) //判断文件是否成功打开 { cout << "Error opening file" << endl; return 1; } outFile.open("C:/digital_mapping/real_polyline.txt");//打开文件用于写入数据 //outFile1.open("C:/C_AttributeNew.txt"); while (!inFile.eof()) { // string Line; getline(inFile, Line); //获取一行的数据,存放到Line中 // int Begin, End; if ((Begin = Line.find("Polyline")) != string::npos)//若该行中存在"Polyline"的字符 { //begin原本等于0 Begin += 8; //begin=8; //end=9; End = Line.find(' ', Begin + 1); count = Line.substr(Begin + 1, (End - (Begin + 1))); cout << "该层中包含" << count << "个线数据" << endl; outFile << "Polyline" << endl; int i = 1; while (getline(inFile, Line)) { //局部变量的begin和上面的begin没有关系 Begin = 0; End = Line.find(' ', Begin + 1); a = Line.substr(Begin, (End - (Begin + 1))); argv = atof(a.c_str()); //outFile1 << argv[num][0] << endl; getline(inFile, Line); Begin = 0; End = Line.find(' ', Begin + 1); m = Line.substr(Begin + 1, (End - (Begin + 1))); //cout << "该条线中包含" << m << "个点数据" << endl; outFile << i << " " << 0 << endl; int j = 0; while (getline(inFile, Line)) { Begin = 0; End = Line.find(',', Begin + 1); X = Line.substr(Begin, (End - (Begin))); //P.xx.push_back.atof(X.c_str()); P.x = atof(X.c_str()); Begin = Line.find(','); Begin += 1; End = Line.find(' ', Begin + 1); Y = Line.substr(Begin + 1, (End - (Begin + 1))); //P.yy.push_back.atof(X.c_str()); P.y = atof(Y.c_str()); outFile << j << " " << P.x << " " << P.y << endl; j++; if ((Begin = Line.find("END_COOR")) != string::npos) break; } outFile << "END" << endl; i++; num++; } } } inFile.close(); outFile.close(); return 0; }
//数据格式


浙公网安备 33010602011771号