C言語関係掲示板

過去ログ

No.975 ファイルを開かないでファイルの行数を取得したい

[戻る] [ホームページ]
No.12635

ファイルを開かないでファイルの行数を取得したい
投稿者---愛子(2004/02/10 21:09:20)


こんにちは。
UNIX C です。
ファイルを開くことなく、行数を取得出来たら と思っています。

UNIXコマンドとしては、
cat ファイル名 | wc -l
で求まりますが、
これをCで実現するにはどうしたらいいのでしょうか?

char *b;

b = getenv("cat iddq.failinfo | wc -l");

ではないし、、、
どなたかご存知の方がいらしたら教えて下さい。

結局は、ファイルを開いてfgetsでカウントしていっても
同じなのでしょうか?
ファイルの行数は、30,000行位です。


No.12638

Re:ファイルを開かないでファイルの行数を取得したい
投稿者---Hazard52(2004/02/10 21:49:13)


UNIXでしたら、popen()を使えば、シェルの実行結果を
ファイルを読み込むのと同じように読み込めたと思います。

でも速度的には、自分でカウントした方が早いかもしれませんが...


No.12641

Re:ファイルを開かないでファイルの行数を取得したい
投稿者---かずま(2004/02/10 23:19:04)


int main(int argc, char *argv[])
{
    char cmd[1024];  FILE *fp;  int n;

    sprintf(cmd, "wc -l %s", argc >= 2 ? argv[1] : "");
    fp = popen(cmd, "r");
    if (fp && fscanf(fp, "%d", &n) == 1) printf("%d\n", n);
    return 0;
}


No.12675

Re:ファイルを開かないでファイルの行数を取得したい
投稿者---愛子(2004/02/12 11:53:26)


Hazard52さんレスをありがとうございました。
それに伴い、サンプルコードをご提示下さいましたかずまさんありがとうございました。
popen()関数は知らなかったので、大変、勉強になりました。
使わせて頂きます。

ありがとうございました。


No.12680

Re:ファイルを開かないでファイルの行数を取得したい
投稿者---かずま(2004/02/12 13:21:44)


pclose() を追加します。
int main(int argc, char *argv[])
{
    char cmd[1024];  FILE *fp;  int n;

    sprintf(cmd, "wc -l %s", argc >= 2 ? argv[1] : "");
    fp = popen(cmd, "r");
    if (fp == NULL) return 1;
    if (fscanf(fp, "%d", &n) == 1) printf("%d\n", n);
    pclose(fp);
    return 0;
}
popen では、pipe, fork, exec で "sh -c wc -l file" を実行するはずですが、
pclose がないと、wait処理が去れず、最後に起動された子プロセスの wc が
ゾンビになるでしょう。親プロセスが終了すれば、子プロセスは /etc/init の
子になって処理されると思うので、問題ないともいえますが。