从字符串读取变量数据

时间:2019-01-21 06:08:28

标签: c++

我正在阅读禁令的大型日志文件,从这些禁令中,我想在该行中指定一个名称(请参见下面的John)。然后,我只想打印该行的IP。以下是示例日志文件中的几行内容:

  

[13:42:51]詹姆斯·普雷斯顿(IP:11.111.11.11)被约翰取缔

     

[13:42:51]杰拉德·农夫(IP:222.22.222.22)已被詹姆斯禁止下线

     

[13:42:51]卢克·帕克(IP:33.33.333.333)被约翰取缔

到目前为止,我可以得到包含“ john”的禁令行,但是我想从这些行中提取IP地址。

int main() {
ifstream BanLogs;
BanLogs.open("ban-2019.log");

// Checking to see if the file is open
if (BanLogs.fail()) {
    cerr << "ERROR OPENING FILE" << endl;
    exit(1);
}

string item;
string name = "john";
int count = 0;


//read a file till the end
while (getline(BanLogs, item)) {
    // If the line (item) contains a certain string (name) proceed.
    if (item.find(name) != string::npos) {
        cout << item << endl;
        count++;
    }
}

cout << "Number of lines " << count << endl;
return 0;
}

2 个答案:

答案 0 :(得分:2)

由于您是编程新手,因此这是最有效的方法:

    size_t startIdx = item.find("(IP: ");
    if (startIdx == std::string::npos) continue;
    startIdx += 5; // skip the "(IP: " part
    size_t endIdx = item.find(')', startIdx + 1);
    if (endIdx == std::string::npos) continue;
    cout << item.substr(startIdx, endIdx - startIdx) << endl;

使用脚本语言(例如Python)更容易进行此类工作。

答案 1 :(得分:0)

如评论中所述,regular expressions是一种选择。

另一种方法是使用已经用于选择相关行的std::string::find。您对"(IP:"进行云搜索以获取地址的起始位置(实际起始位置是std::string::find的结果加上搜索字符串长度的4)。然后,您可以搜索")"以获取IP地址在字符串中的结束位置。使用这两个位置,您可以使用std::string::substr提取包含IP地址的子字符串。