dポイントプレゼントキャンペーン実施中!

Xcode(C++)で、設定ファイル(test.txt)を読み込むプログラムを作成しています。
困っているのは、できあがった実行ファイル(test.app)と同じディレクトリにその設定ファイルを置いて、test.appをダブルクリックで実行しても、設定ファイルを読み込めないでいます。(VC++ではできたのですが)
もちろん、明示的にtest.txtのパスを下記のソースで指定すれば読み込めます。実行する場所が毎回決まっていないので、カレントディレクトリ内のファイルが読み込めるようにしたいです。
ソースは以下のように書いてます。
Xcode側で何か設定とかがあるのでしょうか?
どなたかご存知の方がいらっしゃいましたらご教授のほどよろしくお願いいたします。
※test.appの場所は、"プロジェクト名/build/Debug/test.app" です。
--------------------------------------------
void main(){

FILE* fp;
char s[256]; 
char *filename = "test.txt";

fp = fopen(filename, "r");

if( ! fp){
printf("ファイルオープン失敗"); // ここに入る
return; 
}
while (fgets(s, 256, fp) != NULL) {
// test.txt を読み込む処理
(中略)
}
(中略)
}

A 回答 (3件)

通常のCやC++の作成環境だと普通は



a/
 test.c …ソース
 test.o …コンパイル済
 test.a …リンク済実行形式

って形で実行形式が生成されるので
aディレクトリに test.txt を入れてあれば読める
ここまでは理解できてると思うんだけど
MacOSXのアプリはここが判りにくい

多分こうなるんじゃないかな

a/
 test.c
 …(他のファイル省略)…
 test.app/

そう、finder上ではファイルに見えているんだけどappは実はフォルダ。
appを右クリック(ctrl+クリック)して「パッケージの内容を表示」ってやってごらん。(ターミナル上でcdで辿っても構わない)
辿っていくと最初に書いた「test.a」に相当するファイルが奥深くで見つかる筈だから。(よく見るアプリは拡張子無しまたは"-bin"というのが付いている)
だから起動された位置と実際のバイナリが駆動している位置が違うって話(No2に戻る)
    • good
    • 0
この回答へのお礼

返答が遅れ申し訳ありません。
出張に行っていて、連絡が遅れてしまいました。

教えていただいた通り、test Debug.appの中身を見ようと右クリックしたら
「パッケージの内容を表示」という項目があったので、選択してみたところ
中身が表示されました。(appがフォルダだったなんて知りませんでした)

中身は...

0)Contents(フォルダ)

------------------- 1) Info.plist(XML Property List File)
------------------- 2) MacOS(フォルダ)
------------------------------・test Debug(Unix実行ファイル(Intel))  // ←これが実行ファイルですね。

------------------- 3) PkgInfo(書類)
------------------------------・Resources(フォルダ)
------------------------------・English.lproj(フォルダ)
-------------------------------------・InfoPlist.strings(ストリングファイル)
-------------------------------------・main.nib(Interface Builder Document)

**************************************************************
そして、2)のMacOSの実行ファイルと同じところに、例の設定ファイル(test.txt)を
おいて実行してみました。(念のため、0,1,3の場所にもおいて試して見ました)

test Debug.appは、パッケージなので、test Debug.appをダブルクリックで実行しました・・・
結果は、ダメでした。

プログラム内での、test.txtのパスの指定の仕方がきっと間違っているんだと思います。
最初に書きました「char *filename = "test.txt";」だと無理なのですかね。
(どうゆう書き方で、指定すれば設定ファイルを読み込むんだろう?相対パス,絶対パスとかは
関係ないですし。)

これで、ダメなら実行ファイルのカレントディレクトリを取得してくるしかないような気が
しています。

Macなので、WinAPIの "GetCurrentDirectory()"などは使えないですし。

とにかく、SAYAKAさんには、実行ファイルと思っていたappが、実はフォルダだったということを
教えて頂き、すごく前進できたと思いますので、これ以上ご迷惑をお掛けできませんので、あとは
自力で解決してみます。

本当に有難うございました。

お礼日時:2009/01/26 16:39

これ、実際にはappのdirじゃなく、その中で起動してるbinのdirがカレントになってるんじゃない?


カレントがどこになってるか確認してみたら良いよ。

デバグ中だとbinの場所がカレントになってて問題なく開くだろうけどapp化したときに位置が変わっちゃうからね。

この回答への補足

早々のご返答ありがとうございます。

すみません、よく理解できなかったのですが、appの中で起動しているbinのディレクトリの存在はどのように確認したらよいのですか。
なお、デバック中は確かに問題なく上記のコードで読み込めるのですが、設定ファイルの場所は、binの場所ではなく、実行ファイルと同じディレクトリ("プロジェクト名/build/Debug/test.txt")に置いてあります。これは、デバック中は、binディレクトリに設定ファイルがあるという事ですか。
何卒、宜しくお願いいたします。

補足日時:2009/01/21 09:24
    • good
    • 0

char *filename = "./test.txt";


とすれば良いのではないでしょうか。
    • good
    • 0
この回答へのお礼

早々のご返答ありがとうございます。
試してみたのですが、結果は同じで読み込む事ができませんでした。

お礼日時:2009/01/21 09:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!