C++两个大文件比较输出增加修改和删除行 高效率
要高效比较两个大文件并输出增加、修改和删除的行,可以使用以下步骤:
- 打开两个文件,分别为文件A和文件B。
- 使用逐行读取的方式,读取文件A的每一行,并将其存储在一个容器(例如vector或unordered_set)中,以便后续的比较和操作。
- 逐行读取文件B的每一行,并进行以下操作:
- 检查当前行是否存在于文件A中,如果存在,则从容器中删除该行,并标记为“未修改”。
- 如果当前行不存在于文件A中,将其标记为“新增”。
- 完成文件B的读取后,容器中剩余的行即为文件A中被删除的行,将其标记为“删除”。
- 根据标记,将新增、修改和删除的行输出到相应的文件或输出流中。
这种方法的优点是避免了对文件A和文件B进行全文比较,而是通过逐行比较和删除操作,减少了内存的占用和运算量。同时,使用哈希表等数据结构可以提高查找速度。
以下是一个示例代码的框架,可以根据实际情况进行修改和优化:
#include <iostream>
#include <fstream>
#include <unordered_set>
#include <string>
void compareFiles(const std::string& fileA, const std::string& fileB,
std::ofstream& addedLines, std::ofstream& modifiedLines, std::ofstream& deletedLines) {
std::ifstream fileAStream(fileA);
std::ifstream fileBStream(fileB);
std::unordered_set<std::string> linesInFileA;
// 读取文件A的每一行并存储
std::string line;
while (std::getline(fileAStream, line)) {
linesInFileA.insert(line);
}
// 逐行读取文件B并进行比较操作
while (std::getline(fileBStream, line)) {
if (linesInFileA.count(line) > 0) {
// 当前行存在于文件A中,从容器中删除
linesInFileA.erase(line);
// 输出到修改文件
modifiedLines << line << std::endl;
} else {
// 当前行不存在于文件A中,输出到新增文件
addedLines << line << std::endl;
}
}
// 容器中剩余的行为文件A中被删除的行,输出到删除文件
for (const auto& deletedLine : linesInFileA) {
deletedLines << deletedLine << std::endl;
}
}
int main() {
std::string fileA = "fileA.txt";
std::string fileB = "fileB.txt";
std::ofstream addedLines("addedLines.txt");
std::ofstream modifiedLines("modifiedLines.txt");
std::ofstream deletedLines("deletedLines.txt");
compareFiles(fileA, fileB, addedLines, modifiedLines, deletedLines);
addedLines.close();
modifiedLines.close();
deletedLines.close();
return 0;
}
以上代码仅为示例,具体的实现和优化还需要根据实际情况进行调整
原文地址: https://www.cveoy.top/t/topic/iaoV 著作权归作者所有。请勿转载和采集!