2015-03-23 5 views
0

Я пытаюсь реализовать программу ls, используя библиотеку dirent. Похоже, что мой DIR * mydir имеет значение <unspecified type>, когда я отлаживаю команду gdb, которая говорит мне, что я не правильно включаю заголовок dirent.h, но считаю, что я правильно включаю все необходимые файлы заголовков.Реализация ls-программы в C с использованием 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); 
} 
+0

Какое сообщение у вас есть? На мой взгляд, gdb не заботится о том, как/что вы правильно или нет ... –

+0

@MatsPetersson Если я запустил программу, он ничего не печатает, когда я использую gdb и эту команду (gdb) print mydir, я получаю $ 1 = (DIR *) 0x601010, и если я использую print * mydir, я получаю $ 2 = <неполный тип> – user3501476

+0

Когда mydir имеет значение NULL, это не обязательно означает, что файл или каталог не существует. Вместо этого вы должны назвать perror. –

ответ

6

Ну скрытые в плохо представленные код лежат две уродливые ошибки:

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

Используйте вместо этого:

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

entry не инициализирован, компиляция с предупреждениями, включенных как по gcc -Wall заметил бы проблема. Дополнительный ; в конце условия while сложнее определить, используйте более последовательный стиль программирования, чтобы избежать таких ошибок.

+0

Что-то не так с тем, как я использую opendir 'mydir = opendir (dirString [1]); ' – user3501476

+1

@ user3501476: Нет, но передача' argv' непосредственно в 'readDirectory()' не удобна, вы должны определить 'readDirectory (const char * pathname)' и передать 'argv [1]' этому. – chqrlie

+0

Спасибо, ребята, он работает. – user3501476