如何使用c中的系统调用按照当前目录的大小来显示文件名以上升顺序显示?

发布于 2025-02-01 23:16:50 字数 1276 浏览 1 评论 0原文

我正在尝试使用c中的系统调用来根据其大小对文件名进行排序。

我尝试了这个...

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <limits.h>
#include <string.h>

int main() {
    DIR *dir1, *dir2;
    int fd, cur_size, min_size;
    struct dirent *dirent1, *dirent2;
    struct stat st1, st2;
    char min_file_name[1000];
    char filename[1000];
    dir1 = opendir(".");
    while ((dirent1 = readdir(dir1)) != NULL) {
        min_size = INT_MAX;
        dir2 = opendir(".");
        while ((dirent2 = readdir(dir2)) != NULL) {
            stat(dirent2->d_name, &st1);
            cur_size = st1.st_size;
            strcpy(filename, dirent2->d_name);
            if (cur_size <= min_size && strcmp(min_file_name, filename) != 0) {
                min_size = cur_size;
                strcpy(min_file_name, dirent2->d_name);
            }
        }
        printf("File name = %s || size = %d \n", min_file_name, min_size);
    }
}

输出

amol@amol-Ideapad-320:~/AOS$ gcc q3.c
amol@amol-Ideapad-320:~/AOS$ ./a.out

File name =  || size = 0 
File name =  || size = 0 
File name =  || size = 0 
File name =  || size = 0 

I am trying to sort file names according to their sizes using a system call in c.

I tried this...

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <limits.h>
#include <string.h>

int main() {
    DIR *dir1, *dir2;
    int fd, cur_size, min_size;
    struct dirent *dirent1, *dirent2;
    struct stat st1, st2;
    char min_file_name[1000];
    char filename[1000];
    dir1 = opendir(".");
    while ((dirent1 = readdir(dir1)) != NULL) {
        min_size = INT_MAX;
        dir2 = opendir(".");
        while ((dirent2 = readdir(dir2)) != NULL) {
            stat(dirent2->d_name, &st1);
            cur_size = st1.st_size;
            strcpy(filename, dirent2->d_name);
            if (cur_size <= min_size && strcmp(min_file_name, filename) != 0) {
                min_size = cur_size;
                strcpy(min_file_name, dirent2->d_name);
            }
        }
        printf("File name = %s || size = %d \n", min_file_name, min_size);
    }
}

Output

amol@amol-Ideapad-320:~/AOS$ gcc q3.c
amol@amol-Ideapad-320:~/AOS$ ./a.out

File name =  || size = 0 
File name =  || size = 0 
File name =  || size = 0 
File name =  || size = 0 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

李白 2025-02-08 23:16:50

恐怕我不了解您的嵌套循环方法中的逻辑。

要以给定的顺序产生列表,您可以构造目录中的条目的排序列表并打印出来。

这是一个修改版本,使用链接列表上的简单二次插入排序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

struct entry {
    char *name;
    long long int size;
    struct entry *next;
};

int main() {
    DIR *dir;
    struct dirent *dp;
    struct stat st;
    struct entry *head = NULL, *ep, **npp;

    dir = opendir(".");
    if (dir == NULL) {
        perror("cannot open directory");
        return 1;
    }
    while ((dp = readdir(dir)) != NULL) {
        ep = calloc(sizeof(*ep), 1);
        if (ep == NULL) {
            perror("cannot allocate memory");
            return 1;
        }
        ep->name = strdup(dp->d_name);
        if (ep->name == NULL) {
            perror("cannot allocate memory");
            return 1;
        }
        if (!stat(dp->d_name, &st)) {
            ep->size = st.st_size;
        }
        for (npp = &head; *npp && (*npp)->size <= ep->size; npp = &(*npp)->next)
            continue;
        ep->next = *npp;
        *npp = ep;
    }
    closedir(dir);
    for (ep = head; ep; ep = ep->next) {
        printf("%s\n", ep->name);
    }
    while ((ep = head) != NULL) {
        head = ep->next;
        free(ep->name);
        free(ep);
    }
    return 0;
}

I'm afraid I don't understand the logic in your nested loop approach.

To produce a list in a given order, you can construct a sorted list of the entries in the directory and print that.

Here is a modified version using a simplistic quadratic insertion sort on a linked list:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>

struct entry {
    char *name;
    long long int size;
    struct entry *next;
};

int main() {
    DIR *dir;
    struct dirent *dp;
    struct stat st;
    struct entry *head = NULL, *ep, **npp;

    dir = opendir(".");
    if (dir == NULL) {
        perror("cannot open directory");
        return 1;
    }
    while ((dp = readdir(dir)) != NULL) {
        ep = calloc(sizeof(*ep), 1);
        if (ep == NULL) {
            perror("cannot allocate memory");
            return 1;
        }
        ep->name = strdup(dp->d_name);
        if (ep->name == NULL) {
            perror("cannot allocate memory");
            return 1;
        }
        if (!stat(dp->d_name, &st)) {
            ep->size = st.st_size;
        }
        for (npp = &head; *npp && (*npp)->size <= ep->size; npp = &(*npp)->next)
            continue;
        ep->next = *npp;
        *npp = ep;
    }
    closedir(dir);
    for (ep = head; ep; ep = ep->next) {
        printf("%s\n", ep->name);
    }
    while ((ep = head) != NULL) {
        head = ep->next;
        free(ep->name);
        free(ep);
    }
    return 0;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文