C プログラムでディレクトリ内のファイル数を見つける必要がありますが、数を保存するのに問題があります。システムコマンドを使用していますが、運がありません。
n = system( " ls | wc -l " ) ;
システムは数値を返さないようですので、この時点でちょっと立ち往生しています。何か案は?
scandir POSIX 関数を使用する必要があります。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/scandir.html
例
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
struct dirent **namelist;
int n;
n = scandir(".", &namelist, 0, alphasort);
printf("%d files\n", n);
Unix 関数を使用して C コードをプログラミングする場合、POSIX 関数はこれを行うための標準的な方法です。ls
独自の機能を標準的な方法で実装できます。
楽しみ!
注: たとえば、ディレクトリ以外の結果のみを取得するために、scandir で使用するセレクターを定義できます。
int selector (struct dirent * entry)
{
return (entry->d_type != 4);
}
その他のオプション タイプについては、http ://www.gsp.com/cgi-bin/man.cgi?topic=dirent にアクセスしてください。
次に、カスタム セレクター (および並べ替え方法) を使用してディレクトリをスキャンできます。
n = scandir(".", &namelist, selector, alphasort);
質問がファイルのカウントに関するものである場合は、@ Arnaldog が示すように、可能であれば C ライブラリ関数を使用して行うことをお勧めします。
ただし、質問が実行された子プロセスからの出力の取得に関するものである場合、popen(3)
/ pclose(3)
(POSIX.1-2001 に準拠) はあなたの友人です。によって返されるものと同じように使用できる関数popen()
リターンポインターは、リソース リークを回避するためにを使用してストリームを閉じることを忘れないでください。FILE
fopen()
pclose()
簡単なイラスト:
#include <stdio.h>
int main(void)
{
int n;
FILE * pf = popen("ls | wc -l", "r");
if (pf == (FILE *) 0) {
fprintf(stderr, "Error with popen - %m\n");
pclose(pf);
return -1;
}
if (fscanf(pf, "%d", &n) != 1) {
fprintf(stderr, "Unexpected output from pipe...\n");
pclose(pf);
return -1;
}
printf("Number of files: %d\n", n);
pclose(pf);
return 0;
}