コマンドライン入力を介してパスを受け入れています。
私がする時
dir=opendir(args[1]);
ループに入りません...つまりdir==null
...
コマンドライン入力をdirポインタに渡すにはどうすればよいですか?
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]
_
file)ではなく、directoryを渡す必要があることに注意してください:
_testprog tmp/file1.txt
_
私は得る:
_Cannot open directory 'tmp/file1.txt'
_
これはディレクトリではなくファイルであるためです(巧妙な場合は、最初のdiropen
が失敗するとdiropen(dirname(v[1]))
を使用できます)。
Cプログラム実行可能ファイルに渡されるパラメーターは文字列(または文字ポインター)の配列に過ぎないため、プログラムがこれらのパラメーターにアクセスする前にこれらの入力パラメーターにメモリが既に割り当てられているため、バッファーを割り当てる必要はありません。プログラム内のエラー処理コードも避けてください(segfaultの可能性を減らします:))。
コードの一部に関するフィードバック。ただし、ほとんどの部分で機能するはずです...
_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バイトより長い場合、buffer
はそれを保持できず、メモリに書き込むべきではありません。ここにバッファをコピーする理由はないので、strcpy
...を使用しないだけでこれらの問題を回避できます。...
_dir=opendir(buffer); //this part
_
これがNULL
を返す場合、いくつかの理由が考えられます。
opendir("my")
を試みるので失敗します_./your_program my directory
_と入力しました)ls
を使用してc
コマンドを実装する簡単な方法を次に示します。たとえば./xls /tmp
#include<stdio.h>
#include <dirent.h>
void main(int argc,char *argv[])
{
DIR *dir;
struct dirent *dent;
dir = opendir(argv[1]);
if(dir!=NULL)
{
while((dent=readdir(dir))!=NULL)
{
if((strcmp(dent->d_name,".")==0 || strcmp(dent->d_name,"..")==0 || (*dent->d_name) == '.' ))
{
}
else
{
printf(dent->d_name);
printf("\n");
}
}
}
close(dir);
}