当前位置: 首页 > 面试题库 >

C ++中目录文件名的自然排序

邢昊焜
2023-03-14
问题内容

我有一个目录列表,我想为其检索文件名并将它们放在字符串向量中,以便它们以“自然”方式排序。例如{ "10.txt" "0.txt" "2.txt" "1.m" "Jan12" "July13.txt" "Nov25.txt" "Jane" "John" }应该是{"0.txt" "1.m" "2.txt" "10.txt" "Jan12" "July13.txt" "Nov25.txt" "Jane" "John" }。最简单的方法是什么?

在阐述“自然”,我们假设从号码的部分组成的字符串 (N) 和文本 (T)
这样...(N)(T)...,那么对于...(N1)(T1)......(N2)(T2)...(N1<N2) (<) (T1<T2),其中 (<)暗示了正确的长期左边项优先。在这种情况下,如果数字在字符串中的相同位置(即),则数字优先于文本字段1.z (<) 1_t.txt

已经有一个库函数可以对字母数字字符串或目录条目进行这种排序吗?

所需的 文件 顺序 。文件名将存储在字符串向量中。

Abhinav@Abhinav-PC /cygdrive/c/AbhinavSamples/shell
$ ls -lv
total 8
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:51 1.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:55 1_t.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:50 3.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:51 4.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:53 10.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:56 10_t.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:56 13.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:53 20.txt

**Simple Sort**
Abhi@Abhi-PC /cygdrive/c/AbhinavSamples/shell
$ ls -l
total 8
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:51 1.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:53 10.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:56 10_t.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:56 13.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:55 1_t.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:53 20.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:50 3.txt
-rw-r--r--+ 1 Abhinav None 2 Mar 17 00:51 4.txt

问题答案:

glibc中有一个功能 完全可以满足您的需求 。不幸的是,它是C,而不是C
++,因此,如果可以接受的话,这是“开箱即用”的最简单的解决方案,而无需重新实现任何功能和重新设计轮子。顺便说一句:这与ls -lv实施完全相同。其中最重要的部分是为您versionsort执行 自然排序
的功能。在此用作的比较功能scandir。下面的简单示例将按您希望的顺序打印当前目录中的所有文件/目录。

#define _GNU_SOURCE
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    struct dirent **namelist;
    int n,i;

    n = scandir(".", &namelist, 0, versionsort);
    if (n < 0)
        perror("scandir");
    else
    {
        for(i =0 ; i < n; ++i)
        {
            printf("%s\n", namelist[i]->d_name);
            free(namelist[i]);
        }
        free(namelist);
    }
    return 0;
}


 类似资料:
  • 问题内容: 我有一个包含jpg和其他文件的目录,所有jpg的文件名中都带有数字。有些文件名中可能包含其他字符串。 例如。 或者可能是 在Python中,我需要按升序排列所有jpg的列表。这是此代码段 我得到的是这个 显然,它首先盲目地排序最高有效数字。我试过使用,因为您可以看到它希望能够解决该问题,但没有区别。 问题答案: 假设每个文件名中只有一个数字: 这个版本也可以在Python 3中使用:

  • 问题内容: 我有这样的事情: 我想将这些文件重命名为以下形式: 在同一目录中。 我想我可以使用,但是我不知道如何在文件夹和文件重命名的同时使用它。 问题答案: 可以使用bash for loop和: 请注意,如果目录名称包含空格,则上述解决方案将不起作用。相关链接。 另一种基于注释的解决方案(也适用于名称中也包含空格的目录):

  • 问题内容: 有没有一种优雅的方法可以在MySQL数据库中进行高性能的自然排序? 例如,如果我有此数据集: 最终幻想 最终幻想4 最终幻想10 最终幻想12 最终幻想12:爱情之链 最终幻想冒险 最终幻想起源 最终幻想战术 除了将游戏名称拆分成各个组成部分外,其他任何 优雅的 解决方案 标题 :《最终幻想》 编号 :“ 12” 副标题 :“ Promathia的链条” 确保它们以正确的顺序出现?(1

  • 问题内容: 如何使用Python获取目录中现有的文件夹名称? 我想将所有子文件夹保存到列表中,以便在此之后使用名称,但是我不知道如何读取子文件夹名称? 谢谢你的帮助 问题答案: 您可以使用 编辑 如果您只想要第一个级别,而不是真正地“遍历”子目录,则代码更少: 这并不是真正的目的。如果您确实只想要一个子目录级别,也可以使用Yannik Ammann建议的方法:

  • 问题内容: 有没有一种简单的方法可以使用Python重命名目录中已包含的一组文件? 示例: 我有一个充满* .doc文件的目录,我想以一致的方式重命名它们。 X.doc->“ new(X).doc” Y.doc->“ new(Y).doc” 问题答案: 这样的重命名非常容易,例如使用os和glob模块: 然后可以在示例中使用它,如下所示: 上面的示例会将dir中的所有文件都转换为,其中是文件的先前

  • 问题内容: 我试图读取文件夹的文件名并将它们保存在数组列表中,但是我在我不想要的数组中得到了不可见的文件名(实际上我只想保存.txt文件名)。有谁知道在创建列表之前先在代码中进行更改吗? 问题答案: 使用java.nio.file。使用Java 8: 如果你的Java 7中,执行等效采用: