改进打印目录的打印名和姓

时间:2015-11-18 10:16:27

标签: c sorting directory

我是C的初学者,随着我的进步而学习。我已经采用并修改了一个程序,以按排序顺序打印目录中文件的名称。 我只想按排序顺序打印First和Last文件。 (例如:c.txt,z.docx,f.jpg,a.docx:输出将是a.docx和z.docx)

目录大小:近2,000,000个文件
文件大小:每个大小最多为2MB左右

跨栏赛 名字打印为“。”第二个名字是“..” 排序是通过大写,如何切换到小写

如果有更简单或更好的方法来执行以下代码,那也很高兴。

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

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

    n = scandir(".", &namelist, NULL, alphasort);
    if (n < 0)
    {
        perror("scandir");
    }
    else
    {
        while (i<n)
        {
            if (i == 0) // First Name
            {
                printf("%s\n", (namelist[i])->d_name);
            }
            if (i == n-1) // Last Name
            {
                printf("%s\n", (namelist[i])->d_name);
            }
            free(namelist[n]);
            i++;
        }
        free(namelist);

    }
}

1 个答案:

答案 0 :(得分:0)

也许如果你删除了while部分并且只打印第三部分(去考虑那个......)和最后一个入口:

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

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

    n = scandir(".", &namelist, NULL, alphasort);
    if (n < 0)
    {
        perror("scandir");
    }
    else
    {

        printf("%s\n", (namelist[2])->d_name);
        printf("%s\n", (namelist[n-1])->d_name);

        while(i<n)
            free(namelist[i++]);
        free(namelist);
    }
    return 0;
}

不要忘记return 0;正如您指定的那样,您应该在主页中返回int。现在你可以在恒定的时间内打印你的东西,但是内存仍然需要Θ(n)来解除分配。 如果您还想忽略隐藏文件(以'。'开头),您应该添加一个过滤函数:

int filter(const struct dirent *entry) {
    return entry->d_name[0] != '.';
}

并将其添加到scandir参数

scandir(".", &namelist, filter, alphasort);

然后你应该改变第一个打印索引,因为'。'和'..'将由过滤器处理。

printf("%s\n", (namelist[0])->d_name);