如何将文本文件中的行与以下的多行进行比较

How can I compare line from text file to multiple lines following?

本文关键字:比较 文本 文件      更新时间:2023-10-16

我有一个包含 1、2 和 3 的文本文件,如下所示:

1
1
2
3
3
3
1
2
2
2
2
1

..我正在尝试找到一种方法来找出每个连续多少个。

例如,如果我检查 1,它将输出:1连胜:2,2连胜:1,3连胜:0,4连胜:0....一直到连续 20 个(数组大小),因为连续有 2 个 1,然后自己有 2 个 1(连续只有 1 个)

我正在尝试计算数字 1 连续只有 1 次、连续 2 次、连续 3 次等最多 20 次(如果我有更长的列表)

到目前为止,这就是我所拥有的,但是我不知道在???行该怎么做:

int main()
{
    ifstream file("test.txt");
    string linebuffer;
    int sequenceCounts[20];
    int onez = 0;
    while (file && getline(file, linebuffer)){
        if (linebuffer.length() == 0)continue;
        {
            if (linebuffer == "1")
            {
                ??? while the next is 1->onez++
                sequenceCounts[onez]++;
            }
        }
    }
    return 0;
}
尝试如下内容

int sequenceCounts[20];
int currentOnes = 0;
while (file && getline(file, linebuffer)){
  if (linebuffer.length() == 0){
    if (currentOnes > 0){
      sequenceCounts[currentOnes]++;
    }
    continue;
  }
  if (linebuffer == "1")
  {
    currentOnes++;  //We found another 1,
    //meaning the current group is bigger than in the last line.
  } else if (currentOnes > 0){
    //This line does not contain a "1", but the previous lines did
    sequenceCounts[currentOnes]++;
    currentOnes = 0;
  }
}

基本上,每次遇到"1"时,您都会增加一个计数器,即当前序列的长度。当序列完成时(一行没有"1",但前面有"1"),您可以增加该特定数量的"1"的计数器,并为当前序列重置计数器。

编辑:如果文件以"1"结尾,则上一个失败

我使用向量和简单的映射来保持最长的连续连胜,所以你只需要阅读这些行,将它们解析为整数,然后将它们添加到向量中。

#include <iostream>
#include <cstdlib>
#include <vector>
#include <fstream>
#include <algorithm>
#include <map>
int mostConsec(const std::vector<int> &vec) {
    std::map<int, size_t> consecMap;
    size_t count = 0;
    int current = vec.front();
    for (auto i : vec) {
        if (consecMap.count(current) == 0)
            consecMap[current] = 0;
        if (i == current) {
            count += 1;
            if (consecMap[current] <= count)
                consecMap[current] = count;
        }
        else {
            count = 1;
        }
        current = i;
    }
    auto ptr = std::max_element(
        consecMap.begin(),
        consecMap.end(),
        [](const std::pair<int, size_t> &p1, const std::pair<int, size_t> &p2) {return p1.second < p2.second; }
    );
    return ptr->first;
}
int main(int argc, char **argv) {
    std::vector<int> v;
    std::ifstream inFile("test.txt");
    int tmp;
    while (inFile >> tmp)
        v.push_back(tmp);
    inFile.close();
    int most = mostConsec(v);
    std::cout << most << std::endl;
    system("pause");
}