C++中比较两个文件的方法及代码返回零问题排查
解决C++文件行匹配计数始终为0的问题
嘿,我来帮你排查一下代码里的问题,你的需求是把test.txt的每一行和base_fonctions.txt的所有行逐一比对,每匹配一次计数器加0.5,但现在返回0,主要是两个关键问题导致的:
错误的字符串比较方式
你用ligne == ligne2来比较两行内容,这其实是在比较两个char数组的内存地址,而不是字符串的实际内容。C风格字符串(char数组)需要用strcmp()函数来比较,当返回值为0时,表示两个字符串完全相等。记得要包含<cstring>头文件才能用这个函数。文件流未重置位置
第一次处理test.txt的第一行时,你把flux2(base_fonctions.txt的流)的所有行都读完了,此时文件指针会停在文件末尾,后续的循环再调用flux2.getline()会直接失败,根本不会再读取任何内容。所以每次处理完test.txt的一行后,需要把flux2的指针重置到文件开头,同时清除流的错误状态(因为读到末尾会触发eof标记)。
修正后的完整代码
#include <fstream> #include <cstring> // 引入strcmp所需的头文件 double countMatchingLines() { double count = 0.0; // 必须初始化计数器,避免未知初始值 std::ifstream flux("C:\\Users\\Matthieu\\Desktop\\test.txt", std::ios::in); char ligne[100]; std::ifstream flux2("base_fonctions.txt", std::ios::in); char ligne2[100]; // 额外增加:检查文件是否成功打开,避免文件不存在/路径错误导致的异常 if (!flux.is_open() || !flux2.is_open()) { return count; } while (flux.getline(ligne, 100)) { bool found = false; // 重置base文件流到开头,清除之前的eof错误标记 flux2.clear(); flux2.seekg(0, std::ios::beg); while (flux2.getline(ligne2, 100)) { // 用strcmp比较字符串实际内容 if (strcmp(ligne, ligne2) == 0) { found = true; count += 0.5; // 可选:如果一行只要匹配一次就停止比对,添加break; // break; } } // 原有的if(found==false)代码完全冗余,直接删除 } // 显式关闭文件流(析构时会自动关闭,但显式操作更规范) flux.close(); flux2.close(); return count; }
额外说明
- 如果你希望test.txt的某一行在base文件里只要匹配一次就加0.5(不管base里有多少重复匹配行),可以在
count +=0.5;后面加上break;,提前终止当前行的比对,避免重复计数。 - 一定要初始化计数器
count,原代码里没有显示初始化,可能会导致未知的初始值问题。
内容的提问来源于stack exchange,提问作者UVision
相关产品推荐
相关产品推荐

