字符串的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 
#include 
#include <string>
#include 
#include 
#include 
#include 


using namespace std;

struct Polyline {
    double x = 0;
    double y = 0;
    
    //vector xx;
    //vector 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;
}

//数据格式