C言語の質問です。


#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
int ScanDir (char *dir_name) {
 DIR  *dir_ptr;  
 struct dirent *ent;
  if ((dir_ptr = opendir(dir_name)) == NULL) {
    return(1);
  }
  while((ent = readdir(dir_ptr)) != NULL) {
    printf("%s\n",(ent->d_name)-2);
  }
  closedir(dir_ptr);
  return(0);
}
void main () {
 ScanDir ("/usr");
}
□なせか、ディレクトリメンバーが2バイト短い値で返って くる。しかたなく-2 を入れたら正しく動くようになった。
ちなみにソラリスの最新のスタジオ10:Cコンパイラ。

この現象について、なぜ発生するのか説明をお願いします。
最近、憶測とかで回答する方が多いので
正解者のみ、ポイントを差し上げます。

※cc sample.c -I../inc -xCC -o sample

回答の条件
  • 1人1回まで
  • 登録:2006/05/24 22:20:32
  • 終了:2006/05/25 13:24:41

回答(2件)

id:kazu1107 No.1

kazu1107回答回数199ベストアンサー獲得回数142006/05/24 23:07:10

ポイント35pt

SolarisのFAQページで以下のようなものを見つけました。

原文:http://gd.tuwien.ac.at/sun/solaris/sol2faq/Q6.19.html

訳文:http://sdc.sun.co.jp/solaris/solaris2-faq/Q6.19.html

英語には疎いのでミスリードかもしれませんけど、要するに"#include <dirent.h>"ではなく"#include <sys/dir.h>"を使えということではないでしょうか?(訳文ではsys/dir.hが見事に抜け落ちてます・・・。)

"/opt/SUNWspro/bin/cc"の方もためしてみてはいかがでしょうか?

id:goldman

なるほど、man opendir で調べてdirent.hを使ったのですが、マニュアルに誤りがある可能性があるということですね。

サンスタジオを入れるまでは、ccコマンドが使えなかったので、たぶん"/opt/SUNWspro/bin/cc"だと思うのですが

確認は必要かもしれませんね。明日試してみます。

2006/05/24 23:29:03
id:RC30-popo No.2

POPO回答回数345ベストアンサー獲得回数132006/05/24 23:40:28

ポイント35pt

マニュアルが間違ってるわけでは無いです。

SolarisはSVR4互換ですが、BSD互換ライブラリというものも入っています。(libucb.a,libucb.so)

BSD互換ライブラリはその名のとおりBSD版UNIX用に作られたソフトをコンパイルして動かすために存在しています。

SVR4互換の標準libcにもBSD互換ライブラリにも両方に同じreaddir()という関数が入っていますが、使用するdirent構造体の定義は異なっているのです。

正しく動かない理由はリンクされたreaddirはBSD互換ライブラリのバイナリなのに、構造体定義は標準libcのモノになっていて噛みあわないためでしょう。

sys/dir.hはBSD互換ライブラリ用です。

dirent.hはSVR4互換(というかPOSIX標準というべきか)

まずは環境変数PATHを調べて/usr/ucbが入っていたら外すか、サンスタジオの標準コンパイラのパスより後ろにもって行くかする必要があります。

基本的にはdirent.hで正しく動く環境を作るべきで、BSD互換ライブラリは使わないのが正解です。(後々他のOSにプログラムを移植したりするのに苦労します)

id:goldman

なるほど。dirent.h はそのままで正しいということですね。

BSD版は使わないようにします。

2006/05/25 00:51:36

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません