C++比较两个文件并计数相等行:代码返回0问题排查
问题分析与修复方案
哥们,你的代码里有两个核心问题导致明明有匹配行却返回0,咱们一步步来解决:
1. 错误的字符串比较方式
你用ligne == ligne2来比较两行内容,这是C++新手常踩的坑!因为ligne和ligne2是char数组名,本质是指向数组首元素的指针,==比较的是两个指针的地址,而不是字符串的实际内容。
正确的做法是用C标准库的strcmp函数(需要包含<cstring>头文件),或者更推荐用C++的std::string来存储每行内容,直接用==就能比较内容。
2. 第二个文件流未重置位置
当你处理test.txt的第一行时,flux2.getline()会把base_fonctions.txt的内容从头到尾读一遍,读完后文件流的指针会停在文件末尾,并且设置了eof(文件结束)标记。接下来处理test.txt的第二行时,flux2.getline()会直接失败,因为流已经处于eof状态了,自然找不到任何匹配。
解决方法是:每次处理完test.txt的一行后,把flux2的指针重置到文件开头,同时清除流的错误状态。
修复后的代码(两种方案)
方案一:继续使用char数组(兼容你的原始写法)
#include <fstream> #include <cstring> // 必须包含这个头文件用strcmp double compareFiles() { double count = 0.0; // 记得初始化计数器 std::ifstream flux("C:\\Users\\Matthieu\\Desktop\\test.txt", std::ios::in); std::ifstream flux2("base_fonctions.txt", std::ios::in); if (!flux.is_open() || !flux2.is_open()) { // 增加文件打开失败的判断,避免后续错误 return 0.0; } char ligne[100]; while (flux.getline(ligne, 100)) { bool found = false; // 重置第二个文件流到开头,清除错误状态 flux2.clear(); flux2.seekg(0, std::ios::beg); char ligne2[100]; while (flux2.getline(ligne2, 100)) { // 用strcmp比较字符串内容,返回0表示相等 if (strcmp(ligne, ligne2) == 0) { found = true; count += 0.5; break; // 找到匹配就可以跳出内层循环,不用继续读了 } } // 这里found==false时count不变,这段代码可以省略 } return count; }
方案二:用std::string更安全(推荐)
char数组有缓冲区溢出的风险,用std::string可以自动管理内存,更安全也更简洁:
#include <fstream> #include <string> double compareFiles() { double count = 0.0; std::ifstream flux("C:\\Users\\Matthieu\\Desktop\\test.txt"); std::ifstream flux2("base_fonctions.txt"); if (!flux || !flux2) { return 0.0; } std::string ligne; while (std::getline(flux, ligne)) { bool found = false; flux2.clear(); flux2.seekg(0); std::string ligne2; while (std::getline(flux2, ligne2)) { if (ligne == ligne2) { // 直接用==比较字符串内容,非常直观 found = true; count += 0.5; break; } } } return count; }
额外优化建议
- 增加文件打开失败的判断:如果某个文件打不开,直接返回0,避免后续无意义的操作。
- 找到匹配后跳出内层循环:一旦找到相等的行,就不用继续读第二个文件的剩余内容了,节省时间。
内容的提问来源于stack exchange,提问作者UVision
相关产品推荐
相关产品推荐

