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

How to extract specific substring from getline function in C++?

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

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

  1. 打开两个输入文件("infileicd" 和 "infilesel")。
  2. 打开单个输出文件"list.txt"。
  3. 逐行比较"infilesel"和"infileicd"。
  4. 如果在 "infileicd" 中找到来自 "infilesel" 的行,它会将那行从 "infileicd" 写入 "list.txt",有效地创建一个单独的日志文件。

我正在使用 getline() 函数执行此操作,但在尝试比较每个文件行时 运行 遇到了麻烦。我认为如果我可以只使用感兴趣的子字符串作为比较可能会更容易。 问题是整个 getline 字符串中有多个单词,我只对第二个真正感兴趣。这里有两个例子:

"1529 nic1_mau_op_mode_3"8664afm007-01""1"输出 1 0 逻辑 4 4136"

"1523 pilot_mfd_only_sel"8664afm003-02""1"输出 1 0 逻辑 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;
}

所以,根据我们在评论中讨论的内容,您只需要扔掉您不想要的东西即可。所以试试这个:

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 需要一个分隔符,默认情况下是换行符。第一次设置为 space ,去掉第一个垃圾部分,用同样的方法,得到你想要的部分,然后最后部分到行尾,同样忽略它。