通过所有文件从一行中查找特定字符串

时间:2015-05-26 18:52:22

标签: c++ string pattern-matching fstream ofstream

我有一个文件,我想在一行中搜索一个特定的字符串,然后将该字符串与包含5000行的整个文件进行比较。与该字符串匹配的所有行将在另一个文本文件上写入。到目前为止,我已成功从第一行获取该特定字符串并写入所有与特定字符串匹配的行。以下是仅解决第一行问题的代码。

 #include <iostream>
 #include <fstream>

 using namespace std;

 //gets the specific string from first line
 string FirstLineSplitedString()
 {
ifstream infile;
infile.open("test.txt");
//prints first line
string fline;
string splited;
if (infile.good())
{
string sLine;
getline(infile, sLine);
fline = sLine;

//string starting from Cap900 till before .waa (specific string)
int first = fline.find('_');
int last = fline.find_last_of('.');
splited = fline.substr (first+1,last-first);

}
return splited;
}


 int main()
 {
string SString = FirstLineSplitedString();
ifstream  stream1("test.txt");
string line ;
ofstream stream2("output.txt");

while( std::getline( stream1, line ) )
{
if(line.find(SString) != string::npos)
    stream2 << line << endl;
 }


stream1.close();
stream2.close();
  return 0;
}

我无法想象如何做:我不知道如何对所有文件执行此操作。我的意思是当我完成从第一行找到特定字符串并写入所有那些与字符串匹配的行时,如何转到下一行并执行相同的步骤并写下所有匹配字符串彼此之间的行。此外,如果没有匹配,则只将该行本身写入文件。

例如:假设我有一个文件test.txt,其中包含以下内容(以粗体显示)

aaaaaa _men在这里。那里。等等 bbbb _men在这里。那里。等等 aaaabbbbbaa来自。那里。等等 zzzzzzzz来自。那里。等等 aaabbbbbaaa _men在这里。那里。等等 aabbbbaaaa _men在这里。那里。等等 nnnnnnn来自。那里。等等

当我运行代码时,我在output.txt中得到以下行 aaaaaa _men在这里。那里。等等 bbbb _men在这里。那里。等等 aaabbbbbaaa _men在这里。那里。等等 aabbbbaaaa _men在这里。那里。等等

这是正确的,因为我想要拆分以获取特定的stringfrom(_)直到last(。)。现在我想要下一行与第一行不同,得到结果。下面是我想从test.txt

实现的output.txt

aaaaaa _men在这里。那里。等等 bbbb _men在这里。那里。等等 aaabbbbbaaa _men在这里。那里。等等 aabbbbaaaa _men在这里。那里。所以在

aaaabbbbbaa _from from。那里。等等 zzzzzzzz来自。那里。等等 nnnnnnn来自。那里。所以在

此模式应该一直持续到文件的第几行

很抱歉写了这么久但我想尽可能清楚。任何帮助都会表示赞赏 另外不要忘记与特定字符串匹配的行可能会相互低于或者可能会在2000行之后。

2 个答案:

答案 0 :(得分:0)

我做了新的更改,我认为现在有效,而且最简单:

#include <iostream>
#include <fstream>
#include <vector>
#include <set>

using namespace std;    

int main()
{
    string line,splited;
    int current_line = 0, first = 0, last = 0;
    ifstream  stream1("test.txt");
    ofstream stream2("output.txt");

    //Set when I'm going to save those distinct keys (splited string)
    set<string>insertedKeys;
    vector<string>my_array;

    while( std::getline( stream1, line ) )
    {
        first = line.find('_');
        last = line.find_last_of('.');
        splited = line.substr (first+1,last-first);         
        insertedKeys.insert(splited);           
        my_array.insert(my_array.end(), line);
        //cout << line << endl;             
    }


    //Then, for each key in insertedKeys you're going to find and save in output.txt those lines that match against the current key
    std::set<string>::iterator it = insertedKeys.begin();   
    for (it ; it != insertedKeys.end(); ++it){
        string current_key = *it;
        for(int i=0 ; i< my_array.size() ; i++){
            line = my_array[i];
            if( line.find(current_key) != string::npos ){   
                stream2 << line << endl;    
            }
        }
        stream2 << " ----------------------------------------------------------------------- " << endl;     
    }
}

答案 1 :(得分:0)

所以我认为你需要根据一些子串键对输入文件行进行分组。

最简单的方法是在读取文件时填充内存中的行组集合,然后在处理完整个输入后将组刷新到输出文件:

%%i