I am accepting the path through command line input.
When I do
dir=opendir(args[1]);
it doesn' t enter the loop...i.e dir==null
...
How do I pass the command line input to dir pointer?
void main(int c,char **args)
{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer, args[1]);
dir = opendir(buffer); //this part
if(dir!=NULL)
{
while((dent=readdir(dir))!=NULL)
printf(dent->d_name);
}
close(dir);
}
./a.out /root/TEST is used to run the program..
./a.out --> to execute the program
/root/TEST --> input by the user i.e valid path
Вам действительно стоит опубликовать свой код, но начнем. Начните с:
#include <stdio.h>
#include <dirent.h>
int main (int c, char *v[]) {
struct dirent *pDirent;
DIR *pDir;
if (c < 2) {
printf ("Usage: testprog <dirname>\n");
return 1;
}
pDir = opendir (v[1]);
if (pDir == NULL) {
printf ("Cannot open directory '%s'\n", v[1]);
return 1;
}
while ((pDirent = readdir(pDir)) != NULL) {
printf ("[%s]\n", pDirent->d_name);
}
closedir (pDir);
return 0;
}
В вашем случае вам нужно проверить, что args [1]
задано и относится к фактическому каталогу. Когда это запускается с:
testprog tmp
( tmp
- это подкаталог вне моего текущего каталога, но вы можете использовать любой допустимый каталог), я получаю:
[.]
[..]
[file1.txt]
[file1_file1.txt]
[file2.avi]
[file2_file2.avi]
[file3.b.txt]
[file3_file3.b.txt]
Обратите внимание, что вы должны передать каталог , а не файл . Когда я выполняю:
testprog tmp/file1.txt
, я получаю:
Cannot open directory 'tmp/file1.txt'
, потому что это файл, а не каталог (если вы коварны, вы можете попытаться использовать diropen (dirname (v [1]))
, если исходный diropen
не работает).
Некоторые отзывы о сегменте кода, хотя по большей части он должен работать...
void main(int c,char **args)
int main
- стандарт определяет main
как возвращает int
. c
и args
обычно называются argc
и argv
, со всем уважением, но вы можете называть их как угодно...
{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer,args[1]);
args[1]
длиннее 50 байт, буфер
не сможет его удержать, и вы запишете в память, что вы не должен. Я не вижу причин копировать буфер сюда, поэтому вы можете обойти эти проблемы, просто не используя strcpy
... ...
dir=opendir(buffer); //this part
If this return NULL
], это может быть по нескольким причинам:
./your_program мой каталог
, что не удастся, потому что он пытается opendir("my")
)Параметры, передаваемые исполняемому файлу программы C, представляют собой не что иное, как массив строк (или указателей на символы), поэтому память уже была выделена для этих входных параметров до того, как ваша программа получит доступ к этим параметрам, поэтому нет необходимости выделять буфер, и это таким образом, вы также можете избежать кода обработки ошибок в своей программе (уменьшить вероятность segfault :)).