【问题标题】:Implementing ls program in C using dirent.h使用dirent.h在C中实现ls程序
【发布时间】:2015-05-27 02:10:50
【问题描述】:

我正在尝试使用 dirent 库来实现 ls 程序。当我使用 gdb 进行调试时,我的 DIR * mydir 似乎是 <unspecified type>,这对我说好像我没有正确包含 dirent.h 头文件,但我相信我正确地包含了所有必需的头文件.

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

//Specifies whether or not to print hidden files
#define PRINT_HIDDEN 0

void readDirectory(char *dirString[]);

int main(int argc,char* argv[]) 
{
if(argc!=2)
{
printf("Usage: ./ls <directory>\n");
}

readDirectory(argv);    

return 0;
}

void readDirectory(char *dirString[])    
{
DIR *mydir; 
struct dirent *entry;
//Opening the directory and checking if valid
mydir = opendir(dirString[1]);  

if(mydir==NULL){
fprintf(stderr,"ls: cannot access %s: No such file or directory\n",
  dirString);
exit(EXIT_FAILURE);
}   
//Printing directories/files in specified directory
while((entry==readdir(mydir))!=NULL);
{
if(PRINT_HIDDEN)
{
  printf("%s ",entry->d_name);
}
else
{
  if(entry->d_name[0]!='.')
  {
    printf("%s ",entry->d_name);
  }
}
}
printf("\n");
//Closing the directory
closedir(mydir);
}

【问题讨论】:

  • 您收到的具体信息是什么?在我看来,gdb 不应该关心你是如何/什么是正确的或不包括...
  • @MatsPetersson 如果我运行该程序,它不会打印任何内容,因此当我使用 gdb 并且此命令 (gdb) print mydir 时,我得到 $1 = (DIR *) 0x601010 如果我使用 print *mydir ,我得到 $2 =
  • 当 mydir 为空时,并不一定意味着文件或目录不存在。您应该改为调用 perror。
  • 这对我来说似乎是一个合理的地址。单步执行代码时会发生什么?
  • 请用空格缩进您发布到 SO 的代码。

标签: c ls dirent.h


【解决方案1】:

在糟糕的代码中隐藏着两个丑陋的错误:

while((entry==readdir(mydir))!=NULL);
{
    ...
}

改用这个:

while ((entry = readdir(mydir)) != NULL) {
    ...
}

entry 未初始化,使用 gcc -Wall 启用的警告进行编译会发现问题。 while 条件末尾的额外 ; 更难发现,请使用更一致的编程风格来避免此类错误。

【讨论】:

  • 我使用opendir的方式有问题mydir = opendir(dirString[1]);
  • @user3501476: 不可以,但是将argv 直接传递给readDirectory() 不方便,你应该定义readDirectory(const char *pathname) 并将argv[1] 传递给它。
  • @Anto:我注意到了这一点,并在您发表评论之前编辑了我的回复,这种错误是经典 K&R 样式规则的一个很好的例子。
  • @user3501476:同时修复fprintf(stderr,"ls: cannot access %s: No such file or directory\n", dirString);:改为传递dirString[1]
  • @user3501476 在打印使用后添加退出/返回,否则程序核心转储,因为他无法访问argv[1]
猜你喜欢
  • 2016-07-25
  • 2017-04-09
  • 2022-11-13
  • 2018-03-15
  • 2012-11-13
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多