gpt4 book ai didi

c++ - 控制台程序中的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 02:05:53 25 4
gpt4 key购买 nike

我必须为开发人员实习面试编写一个小型控制台程序,但出现了一些很难发现的大问题。我应该编写一个程序来检查一个充满二进制 .dat 文件的目录是否有重复文件。

我做了什么:我使用 main.cpp 中的标准输入输入一个文件,如果该目录存在,我将路径传递给我的 fileChecker 函数,该函数然后为给定目录中的所有文件生成 MD5 哈希值,然后创建一个 QHash,文件名作为键,哈希作为值。然后我尝试使用 java 风格的迭代器迭代 QHash。当我运行程序时,它完全崩溃了,我必须选择调试或结束程序,这让我无法找出问题所在,因为 QT 的调试器不输出任何内容。

我的猜测是我在 fileChecker.cpp 中的 getDuplicates 函数出了点问题,因为我之前从未使用过 java 风格的迭代器来迭代 QHash。我正在尝试获取第一个键值对并将其存储在两个变量中。然后,我从 QHash 中删除这些值,并尝试使用前一个迭代器中的迭代器迭代 QHash 的其余部分。如果有人知道我做错了什么,请尽快告诉我,因为我需要在星期一之前完成此操作才能接受采访……下面是 fileChecker.h 和 fileChecker.cpp 的代码,请告诉我是否有我可以添加更多内容。谢谢

我的代码:

main.cpp:

#include "filechecker.h"
#include <QDir>
#include <QTextStream>
#include <QString>
#include <QStringList>

QTextStream in(stdin);
QTextStream out(stdout);

int main() {
QDir* dir;
FileChecker checker;
QString dirPath;
QStringList duplicateList;

out << "Please enter directory path NOTE: use / as directory separator regardless of operating system" << endl;
dirPath = in.readLine();


dir->setPath(dirPath);
if(dir->exists()) {
checker.processDirectory(dir);
duplicateList = checker.getDuplicateList();
}
else if(!(dir->exists()))
out << "Directory does not exist" << endl;

foreach(QString str, duplicateList){
out << str << endl;
}

return 0;
}

fileChecker.h:

#ifndef FILECHECKER_H
#define FILECHECKER_H
#include <QString>
#include <QByteArray>
#include <QHash>
#include <QCryptographicHash>
#include <QStringList>
#include <QDir>

class FileChecker
{
public:
FileChecker();
void processDirectory(QDir* dir);
QByteArray generateChecksum(QFile* file);
QStringList getDuplicateList();
private:
QByteArray generateChecksum(QString fileName);
QHash<QString, QByteArray> m_hash;
};

#endif // FILECHECKER_H



fileChecker.cpp:

#include "filechecker.h"

FileChecker::FileChecker() {
}

void FileChecker::processDirectory(QDir* dir) {

dir->setFilter(QDir::Files);
QStringList fileList = dir->entryList();


for (int i = 0; i < fileList.size(); i++) {
bool possibleDuplicatesFound = false;
QString testName = fileList.at((i));
QFile* testFile;
testFile->setFileName(testName);


foreach(QString s, fileList) {
QFile* possibleDuplicate;

possibleDuplicate->setFileName(s);
if(testFile->size() == possibleDuplicate->size() && testFile->fileName() != possibleDuplicate->fileName()) {
QByteArray md5HashPd = generateChecksum(possibleDuplicate);
m_hash.insert(possibleDuplicate->fileName(), md5HashPd);
possibleDuplicatesFound = true;
fileList.replaceInStrings(possibleDuplicate->fileName(), "");
}
QByteArray md5Hasht = generateChecksum(testFile);
fileList.replaceInStrings(testFile->fileName(), "");
possibleDuplicatesFound = false;
}

}
}


QByteArray FileChecker::generateChecksum(QFile* file) {

if(file->open(QIODevice::ReadOnly)) {
QCryptographicHash cHash(QCryptographicHash::Md5);
cHash.addData(file->readAll());
QByteArray checksum = cHash.result();
return checksum;
}
}

QStringList FileChecker::getDuplicateList() {
QStringList tempList;
QString tempStr;
QString currentKey;
QByteArray currentValue;
QMutableHashIterator<QString, QByteArray> i(m_hash);
do {
while (i.hasNext()){
i.next();
currentKey = i.key();
currentValue = i.value();
tempStr.append("%1 ").arg(currentKey);

if (i.value() == currentValue) {
tempStr.append("and %1").arg(i.key());
i.remove();
}
tempList.append(tempStr);
tempStr.clear();
}
} while (m_hash.size() > 0);

return tempList;
}

最佳答案

除了令人伤心的 Qt 内存管理问题之外,您真的不必计算所有文件的 md5 总和。

仅适用于大小相同的文件组:)

可以忽略具有唯一大小的文件。我什至不会称其为优化,只是没有做可能荒谬的不必要的额外工作:)

关于c++ - 控制台程序中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37557870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com