gpt4 book ai didi

c++ - 调试错误 R6010 - 已调用 abort()

转载 作者:太空宇宙 更新时间:2023-11-04 13:38:57 25 4
gpt4 key购买 nike

我打算制作一个程序,输出它所在文件夹中所有文件的名称,如果其中两个文件的大小相同,它只输出一个。请注意,我是 boost 库的新手,不是经验丰富的程序员。

这是我想出的:

#include <boost/filesystem.hpp>      
#include <iostream>
#include<string>
#include<cstdio>
using namespace std;
void files(string a = ".")
{
bool check = 1;
boost::filesystem::directory_iterator iterator(a);

for (; iterator != boost::filesystem::directory_iterator(); ++iterator)
{

if (is_directory(iterator->path()))
{
files(iterator->path().string());
}
else
{
boost::filesystem::directory_iterator iterator2(a);
iterator2 = iterator;
if (iterator != boost::filesystem::directory_iterator())
{
iterator2++;
}
for (; iterator2 != boost::filesystem::directory_iterator(); ++iterator2)
{
if (file_size(iterator->path()) == file_size(iterator2->path()))
{
check = 0;
}
}
}
if (check == 1)
{

cout << (iterator->path().filename()) << endl;
}
else
{
check = 1;
}
}
}


int main()
{
files();
}

我试图让它毫无异常(exception)地列出所有文件并且它工作正常但是当我添加第二个 for 循环和第二个 directory_iterator 时出现问题。

最佳答案

潜在的问题是 boost::filesystem::directory_iterator 是一个输入迭代器,它不保证保持相等:参见 directory_iterator documentation 中的注释.

在实现中,它很可能会使用类似 POSIX opendirreaddir 接口(interface)的东西,其中有一个底层打开文件描述符,目录条目从中连续阅读。

因此,推进 iterator2,它可能在分配后与 iterator1 共享相同的底层状态,很可能会改变 iterator1 将返回的内容

的确,在我的测试平台(Linux,g++)上,iterator2循环结束后,iterator2等于结束迭代器,iterator1也等于结束迭代器,程序在尝试访问文件名时会出现段错误。

简而言之,iterator2 和 iterator1 没有独立的状态,尽管这种情况并不明显。要解决此问题,最简单的方法是记录您在 std::set(或 C++11 中的 std::unordered_set)中看到的文件大小), 并且仅在集不包含该文件大小时才打印路径。

我在这里包含了一个使用 std::set 来执行此操作的版本。为了简单起见,我省略了到子目录的递归下降。您需要决定是否要忽略与同一子目录中的文件或任何子目录中的文件具有相同大小的文件。

#include <boost/filesystem.hpp>      
#include <iostream>
#include <string>
#include <set>

using namespace std;
void files(string a = ".")
{
boost::filesystem::directory_iterator iterator(a),dir_end;
std::set<uintmax_t> file_sizes;

for (; iterator != dir_end; ++iterator) {
bool emit = true;

if (!is_directory(iterator->path())) {
uintmax_t size = file_size(iterator->path());
if (file_sizes.find(size) == file_sizes.end()) {
// set does not contain this file size yet.
file_sizes.insert(size);
}
else {
// set already contains this file size, so don't print path
emit = false;
}
}

if (emit) {
cout << (iterator->path().filename()) << endl;
}
}
}

int main() {
files();
}

关于c++ - 调试错误 R6010 - 已调用 abort(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28527744/

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