如何将文本文件中的行与后面的多行进行比较?
How can I compare line from text file to multiple lines following?
我有一个包含 1s、2s 和 3s 的文本文件,如下所示:
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"s before) you increase the counter for that particular number of "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");
}
我有一个包含 1s、2s 和 3s 的文本文件,如下所示:
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"s before) you increase the counter for that particular number of "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");
}