【问题标题】:Listing files in Directory in Ubuntu在 Ubuntu 的目录中列出文件
【发布时间】:2012-10-10 22:51:11
【问题描述】:

我试图列出当前目录的父目录中的文件,但是当我尝试从终端执行这个程序时,我得到了分段错误。我做错了什么?代码如下:

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

int main(int argc, char *argv[])
{
   struct dirent *dirpent;
   DIR *dirp;

   if(argc!=2)
   {
       printf("Cant continue with the program\n");
       return 0;
   }

   dirp= opendir(argv[1]);

   if(dirp)
   {
       while(dirpent=readdir(dirp) !=NULL)
           printf("%s\n",dirpent->d_name);

       closedir(dirp);
   }
   return 0;
}

【问题讨论】:

  • 您应该养成在系统调用失败时使用errno 的习惯,例如在这种情况下打印strerror(errno)

标签: c linux ubuntu dir readdir


【解决方案1】:
dirpent=readdir(dirp) !=NULL

应该是

(dirpent = readdir(dirp)) != NULL

您当前的表达式被解析为dirpent = (readdir(dirp) != NULL),这会将dirpent 设置为0 或1。

【讨论】:

  • 但是它也列出了给定目录的子目录中的文件,我怎样才能只显示我指定的目录的文件而不是子目录的文件
【解决方案2】:

如果您使用indent rd.c 缩进您的程序,然后使用gcc -Wall -g rd.c -o rd 编译您的程序,您会得到

 rd.c: In function 'main':
 rd.c:21:22: warning: assignment makes pointer from integer without a cast [enabled by default]
 rd.c:21:7: warning: suggest parentheses around assignment used as truth value [-Wparentheses]

所以你忘了括号,你的while应该是

 while((dirpent=readdir(dirp)) !=NULL)

在提问之前,请编译带有所有警告的程序(并对其进行改进,直到它们全部消失)。使用gdb 调试器(及其bt 命令)找出程序在SIGSEGV 时崩溃的原因。

不要忘记仔细阅读文档,例如 readdir(3) 手册页和 Advanced Linux Programming 书籍。

【讨论】:

  • readdir() 也显示子目录的文件。如何防止显示子目录的文件
  • 你确定吗?根据readdir(3) 手册页,它不应该(而且我相信GNU Libc readdir 实现没有这么大的错误)。尝试ltracestracegdb你的程序来检查。
  • 是的。我正在尝试在包含 10 个文件和两个子目录的桌面上显示文件,但我的输出包含近 25 个以上的文件,其中一些是子目录的文件
  • 您应该信任比桌面更多的系统调用和低级库。 /bin/ls 命令向您展示了什么?检查strace yourprog的输出...
  • 好吧。现在我在挠头。我的桌面显示 10 个文件,但 ls 显示 25 个文件。为什么会这样?我是计算机的管理员,它没有其他用户..
猜你喜欢
  • 2012-12-09
  • 2023-03-03
  • 2012-01-23
  • 2020-01-29
  • 2020-03-19
  • 2013-08-30
  • 2012-03-22
  • 2010-12-04
  • 1970-01-01
相关资源
最近更新 更多