我是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);
}
}
答案 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);