stat函数段错误

发布于 2022-09-07 08:14:18 字数 3208 浏览 17 评论 0

环境centos7 编程语言c
今天在用stat函数读取文件夹的状态是出错,一开始直接传入文件文件夹名返回都是-1,后来查了一下发现需要传入绝对路径,于是文件名与路径名组合起来传入stat之后就报段错误,改了半天都没发现怎么回事,gdb跟踪也没发现什么问题
下面是代码:

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

int main(void)
{
        DIR *dp;
        struct dirent *ep;
        struct stat st;
        char dirp[50];
        char absPath[100];
        printf("请输入目录:\n");
        scanf("%s",&dirp);
        dp=opendir(dirp);
        printf("filename:\ttype:\tPermission\taccesstime\tlastmodtime\tsize\t\n");
        if(dp!=NULL)
        {
                printf("xxx\n");
                while(ep=readdir(dp))
                {
                        if(ep->d_name[0]!='.')
                        {
                                printf("xx\n");
                                if(strcmp(dirp,"/")==0)
                                {
                                        strcpy(absPath,dirp);
                                        strcat(absPath,ep->d_name);
                                }else
                                {
                                        strcpy(absPath,dirp);
                                        strcat(absPath,"/");
                                        strcpy(absPath,ep->d_name);
                                }
                                printf("%s\n",absPath);
                                if(stat(absPath,&st)!=-1)
                                {
                                        printf("%s\t",ep->d_name);
                                        if((st.st_mode&S_IFMT)==S_IFDIR)
                                                printf("Directory\t");
                                        else if((st.st_mode&S_IFMT)==S_IFBLK)
                                                printf("Block special file\t");
                                        else if((st.st_mode&S_IFMT)==S_IFCHR)
                                                printf("character special file\t");
                                        else if((st.st_mode&S_IFMT)==S_IFREG)
                                                printf("Ordinary file\t");
                                        else if((st.st_mode&S_IFMT)==S_IFIFO)
                                                printf("pipefile file\t");
                                        printf("%o\t",st.st_mode&0x1ff);
                                        printf("%15s\t",ctime(st.st_atime));  //文件创建时间 
                                        printf("%15s\t",ctime(st.st_mtime)); //文件上次修改时间 
                                        printf("%ld\n",st.st_size);
                                }
                        }
                }
                closedir(dp);
        }else
        {
                puts("Couldn't open the directory.\n");
        }
        return 0;
       }

运行截图:

clipboard.png
GDB跟踪打印的信息:

clipboard.png
希望各位大佬给我这个初学者一点提示,谢谢

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

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

发布评论

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

评论(1

孤芳又自赏 2022-09-14 08:14:18
  1. 不一定是绝对路径,相对路径也是可以的
  2. 段错误并不是 stat 报的(你在 gdb 的时候,发现 stat 没有报错怎么不往下看看),而是 printf("%15s\t",ctime(st.st_atime)); 以及下面那句,在调用 ctime 的时候,翻下 man 看看 ctime 是怎么用的
  3. scanf("%s",&dirp); 这里你不觉得很不自然吗?
  4. 你拼 absPath 那个地方也是不对的
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文