在C ++中查找文本中的模式

时间:2018-07-19 04:54:42

标签: c++

我编写了以下代码,以在作为“ GCTATAATAGCCATA”的字符串读取的文本中找到“ ATA”的编号。返回的计数应为3,但返回0。当我在调试器中签入时,最初会创建文本字符串。但是,将空字符串传递给函数patternCount时。我是否将文件内容正确读入字符串文本?

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
void  patternCount(string text, string pattern);

int main()
{
    string text;
    fstream file_("test.txt");
    if(file_.is_open())
    {
        while(getline(file_,text))
        {
            cout << text << '\n';
        }
        file_.close();
    }
    cout << "Enter a string ";
    string pattern;
    getline(cin, pattern);
    patternCount(text, pattern);


    return 0;
}

void patternCount(string text, string pattern)
{
    int count = 0;
    size_t nPos = text.find(pattern, 0);
    while (nPos != string::npos)
    {
        nPos = text.find(pattern, nPos + 1);
        ++count;
    }
    cout << "There are " << count <<" " << pattern << " in your text.\n";
}

3 个答案:

答案 0 :(得分:0)

因此,如果我理解正确,则不确定您是否从文件test.txt中正确读取了内容。如果您想阅读所有内容,请尝试以下方法:

ifstream file_("test.txt");
string s,text;
file_>>s;
text=s;
while(file_>>s)
{
    text=text+" "+s;
}

这可能应该起作用。请注意,从文件名>>字符串之类的文件读取仅读取到第一个空格。这就是为什么我要使用while。您还可以使用getline()来读取带有空格的整个文本。另请注意,您应该包括fstream。打印出文字也应该会有所帮助。

答案 1 :(得分:0)

#include<stdio.h>
int main()
{
    int l, i = 0, j;
    float a[100][100];
    float *p;
    FILE *fp;
    fp = fopen("fc.txt", "r");
    fscanf(fp, "%d", &l);
    fclose(fp);
    fp = fopen("Au.txt", "r");
    for (i = 0; i <= l; i++)
    {
        for (j = 0; j <= 2; j++)
        {
            fscanf(fp, "%f", &a[i][j]);
            if (i == l)
            {
                p = &a[i][j];
                p++;
            }
        }
    }
    fclose(fp);
    fp = fopen("i_ri.txt", "w");
    fprintf(fp, "%f", *(p - 1));
    fclose(fp);
    fp = fopen("r_ri.txt", "w");
    fprintf(fp, "%f", *(p - 2));
    fclose(fp);
    fp = fopen("w.txt", "w");
    fprintf(fp, "%f", *(p - 3));
    fclose(fp);
    return 0;
}

问题

您的代码很好,django-admin.py shell函数中没有错误。

但是您正在以错误的方式读取文件。 请参见,每次调用#include <iostream> #include <fstream> #include <string> using std::cout; using std::cerr; using std::string; int count = 0; // we will count the total pattern count here void patternCount(string text, string pattern); int main() { cout << "Enter a string "; string pattern; std::getline(cin, pattern); string text; fstream file_("test.txt"); if(file_.is_open()){ while(std::getline(file_,text)) patternCount(text,pattern); file_.close(); }else cerr<<"Failed to open file"; cout << "There are " << count <<" " << pattern << " in your text.\n"; return 0; } void patternCount(string text, string pattern){ size_t nPos = text.find(pattern, 0); while (nPos != string::npos) { nPos = text.find(pattern, nPos + 1); ++count; } } 时,_text的旧结果都会被新行覆盖。因此,在循环的最后,当您将文本传递给patternCount函数时,仅显示文本包含文件的最后一行。


解决方案

您可以通过两种方式解决它:

  1. 如上所述,您可以在while循环的每一行运行patternCount并更新全局计数变量。
  2. 您可以在while循环中将所有行添加到文本中,最后调用std::getline(file_, text)函数。

无论您愿意使用哪种方法,我都实现了第一个,而其他答案中的第二个则实现了。

答案 2 :(得分:0)

此代码仅计算文本文件最后一行中输入字符串出现的次数。如果该行为空或no不包含字符串,则输出结果将为0。 但是我猜想OP要搜索整个文件,在这种情况下,main函数需要相应地修复。

std::ifstream file{"test.txt"};
std::ostringstream text;
std::copy(std::istream_iterator<char>{file}, std::istream_iterator<char>{},std::ostream_iterator<char>{text});
//...
patternCount(text.str(), pattern);