如何从C ++中的getline函数中提取特定的子字符串?

时间:2015-02-15 03:17:31

标签: c++ string function compare extract

我是C ++的新手,所以如果我的术语或方法不正确,请原谅我。

我正在尝试编写一个简单的程序:

  1. 打开两个输入文件(“infileicd”和“infilesel”)。
  2. 打开单个输出文件“list.txt”。
  3. 逐行比较“infilesel”与“infileicd”。
  4. 如果在“infileicd”中找到“infilesel”中的一行,则会将该行从“infileicd”写入“list.txt”,从而有效地创建单独的日志文件。
  5. 我正在使用getline()函数执行此操作,但在尝试比较每个文件行时遇到了麻烦。我认为如果我只使用感兴趣的子串作为比较可能会更容易。 问题是整个getline字符串中有多个单词,我只对第二个单词感兴趣。以下是两个例子:

    “1529 nic1_mau_op_mode_3”8664afm007-01“”1“OUTPUT 1 0 LOGICAL 4 4136”

    “1523 pilot_mfd_only_sel”8664afm003-02“”1“OUTPUT 1 0 LOGICAL 4 4112”

    “nic1_mau_op_mode_3”和“pilot_mfd_only_sel”是唯一感兴趣的子字符串。

    如果我只能使用第二个子字符串进行比较,那将会更容易,但我不知道如何从getline()函数中专门提取它。我没有发现任何暗示不可能做到这一点的东西,但如果不可能,那么提取该子串的替代方法是什么?

    这是一个个人项目,所以我没有时间限制。

    任何协助都会提前得到很大的帮助。这是我的代码(到目前为止):

    int main()
    {
        //Open the file to write the selected variables to.
        ofstream writer("list.txt");
    
        //Open the selected variabels file to be read.
        ifstream infilesel;
        infilesel.open("varsel.txt");
    
        //Open the icd file to be read.
        ifstream infileicd;
        infileicd.open("aic_fdk_host.txt");
    
        //Check icd file for errors.
        if (infileicd.fail()){
            cerr << "Error opening icd.\n" << endl;
            return 1;
        }
        else {
            cout << "The icd file has been opened.\n";
        }
    
        //Check selected variables file for errors.
        if (infilesel.fail()){
            cerr << "Error opening selection file.\n" << endl;
            return 1;
        }
        else {
            cout << "The selection file has been opened.\n";
        }
    
        //Read each infile and copy contents of icd file to the list file.
    
        string namesel;
        string nameicd;
    
        while(!infileicd.eof()){ 
    
            getline(infileicd, nameicd);
            getline(infilesel, namesel);
    
            if (nameicd != namesel){ //This is where I would like to extract and compare the two specific strings
                infileicd; //Skip to next line if not the same
    
            } else {
                    writer << nameicd << namesel << endl;
            } 
        }
    
    
        writer.close();
        infilesel.close();
        infileicd.close();
    
        return 0;
    }
    

1 个答案:

答案 0 :(得分:0)

所以,根据我们在评论中讨论的内容,你只需要抛出你不想要的东西。所以试试这个:

string namesel;
string nameicd;
string junk;

while(!infileicd.eof()){ 

    // Get the first section, which we'll ignore
    getline(infileicd, junk, ' ');
    getline(infilesel, junk, ' ');

    // Get the real data
    getline(infileicd, nameicd, ' ');
    getline(infilesel, namesel, ' ');

    // Get the rest of the line, which we'll ignore
    getline(infileicd, junk);
    getline(infilesel, junk);

基本上,getline采用分隔符,默认情况下是一个换行符。通过第一次将它设置为空格,你摆脱了第一个垃圾部分,使用相同的方法,你得到你想要的部分,然后最后部分到达行的末尾,也忽略它。