C++ 统计含2个字母A的行写入新文件时重复写入问题如何解决
问题根因
- 重复写入核心原因:统计字符A的内层循环中,只要
licz==2就立即执行写入和计数,没有终止当前行的遍历。如果某行包含2个以上的A,从第二个A开始,每遍历一个后续字符都会触发一次写入,同一行被重复写入多次,计数也同步虚高。 - 读取逻辑错误:使用
plikwe >> temp读取文件时是按空白符分割读取单词,不是按行读取,不符合你筛选「包含2个A的行」的需求。 - 文件遍历逻辑不规范:
while(!plikwe.eof())的判断方式会导致最后多读取一次空内容存入vector,配套的i < t.size()-1循环条件也会漏掉正常的最后一行内容。 - 筛选逻辑不严谨:你没有明确筛选规则是「恰好2个A」还是「至少2个A」,现有逻辑只要累计到2个A就触发,且不会停止判断,会把大于2个A的行也按出现次数多次写入。
修复方案
默认需求为筛选恰好包含2个A的行,先输出所有符合条件的行,最后输出总行数,修复后的代码如下:
#include <iostream> #include <vector> #include <fstream> #include <string> using namespace std; int main() { ifstream plikwe("NAPIS.txt"); ofstream pliwky_a("wynika.txt"); string line; int match_count = 0; // 按行读取文件 while (getline(plikwe, line)) { int a_count = 0; // 统计当前行A的数量 for (char c : line) { if (c == 'A') { a_count++; // 如果已经超过2个可以提前终止统计,优化效率 if (a_count > 2) break; } } // 遍历完整个行确认A的数量为2再写入 if (a_count == 2) { match_count++; pliwky_a << line << endl; } } // 最后写入符合条件的总行数 pliwky_a << match_count << endl; cout << match_count << endl; plikwe.close(); pliwky_a.close(); return 0; }
如果你的需求是筛选至少包含2个A的行,只需要把判断条件改成if (a_count >= 2)即可。
内容的提问来源于stack exchange,提问作者cray 1234
相关产品推荐
相关产品推荐

