- ベストアンサー
xcodeでのファイル操作について
- xcodeでのファイル操作についての解説と対処法
- xcodeでファイル操作が上手くできない時の対処法
- xcodeの設定を調整してファイル操作を正常に行う方法
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ひとまず、カレントディレクトリがどうなっているか、チェックしてみましょう。 #include <stdlib.h> #include <unistd.h> の2つのヘッダをincludeして main()のすぐ下あたりに char *cwd ; cwd=getcwd(NULL, 0); ; printf("CWD:%s\n", cwd); free(cwd); としたら、 CWD:のうしろにカレントディレクトリが表示されるはずなので、 実際にはどこになっているかを確認してみましょう。 あとは、input.txtのリード権が正しいか、 ls -lで確認するのもよいでしょう。 >「プログラミングコンテストに提出する」 その「プログラミングコンテスト」とやらがどんなレギュレーションか、私を始めとする、回答者の誰も知らないと思います。 コマンドライン引数を使ってよいのかどうか、絶対パスは使えないのか、そういうこともわかりません。
その他の回答 (5)
- kmee
- ベストアンサー率55% (1857/3366)
追加: fp = fopen("input.txt", "r"); if ( fp == NULL ) { fprintf(stderr,"File Open Error\n") ; perror(NULL); return 1; } if ( fscanf(fp,"%d", &x) != 1 ) { fprintf(stderr,"fscanf Read Error\n") ; perror(NULL); return 1; } とすると、エラーメッセージが表示されるので、もう少しくわしくわかるかもしれません。
- kmee
- ベストアンサー率55% (1857/3366)
XCodeの設定以前の問題として、 エラーチェックはするべきでしょう。 fp = fopen("input.txt", "r"); if ( fp == NULL ) { fprintf(stderr,"File Open Error\n") ; return 1; } if ( fscanf(fp,"%d", &x) != 1 ) { fprintf(stderr,"fscanf Read Error\n") ; return 1; } 本題ですが、 プログラム中の相対パスは「実行時のカレントディレクトリからの相対的な位置」ということになります。 XCodeの「実行」「デバッグ」で実行した場合、なにも設定してなければ、標準では /プロジェクトのディレクリ/build/構成(Debug, Release等) になっていると思います。 つまり、実行ファイルのあるディレクトリです。 対処方法としては 方法1) input.txtをカレントディレクトリに置く、あるいは、その場所にシンボリックリンクを作る。 今回の場合、実行ファイルのある場所。 方法2) [プロジェクト] > [アクティブは実行可能ファイル"XXXX"を編集] から [一般] > [作業ディレクトリの設定]を input.txt のあるディレクトリにする。 方法3) 「input.txt」にあたるファイル名をコマンドラインオプションで指定するようプログラムを変更して [プロジェクト] > [アクティブは実行可能ファイル"XXXX"を編集] から [引数] > [起動時に渡される引数]に input.txt をフルパスで追加。$(PROJECT_DIR)なども使える。 私としては、方法3 → 方法2 の順で推奨します。 実用的なプログラムの場合、実行ファイルの場所、読み込ませたいファイルの場所、カレントディレクトリがすべて別、というケースがよくあります。 例) ターミナルを起動して cat ~/Documents/foo.txt と実行した場合 カレントディレクトリ: /Users/ユーザー名 実行ファイルの場所: /usr/bin 読み込むファイルの場所: /Users/ユーザー名/Documents
補足
非常に親切なご回答ありがとうございます!! まず、方法1をもう一度やってみましたが、file open error でした;; 方法2もダメでした。 方法3は「プログラミングコンテストに提出する」という観点から考えると、ちょっと・・・。 なぜ、ちゃんと「プロジェクト名/build/Debug」の中にinput.txtを作っても file open error になるのか、 心当たりがあれば教えていただきたいです。m(_ _)m
- harawo
- ベストアンサー率58% (3742/6450)
> しかし、いろいろしらべてみると、相対パスでもできるように設定できるようなことが書いてあったのですが、 > なかなかうまく行きません。 それに、どういう実用的な目的があるのでしょう?ないと、私は思いますが? そもそもMacintosh上で動かすプログラムなら、GUIを備えていないと、実用性が著しく欠けます。GUIを備えるなら、Cocoa(Objective-Cで書かれたフレームワーク)かCarbon(C/C++で書かれたフレームワーク)を使って、アプリケーションを作ることになります。Cocoa、Carbonいずれも、ファイル管理をするためのクラスや関数が用意されているので、それを使って、対象ファイルの是対パスを、かんたんに取得できます。 意味のないことに、これ以上おつきあいするわけにはいきません。あしからず。
補足
>それに、どういう実用的な目的があるのでしょう?ないと、私は思いますが? プログラミングコンテスト等で絶対パスを使うわけにはあまりいかないと僕は思うのです。
- harawo
- ベストアンサー率58% (3742/6450)
> じゃあ、input.txtを保存する場所がおかしいのでしょうか? > プロジェクト名/build/Debug(実行ファイルがある場所)の中に保存してみても、 > Segmentation fault > と表示されます。 相対パスが通用するのかどうか、わたしは知りません。というか、通用しないものと思っています。 絶対パスでテキストファイルの場所を指定しては、いかがですか?
補足
ありがとうございます! 絶対パスで書くと正しく実行されました。 しかし、いろいろしらべてみると、相対パスでもできるように設定できるようなことが書いてあったのですが、 なかなかうまく行きません。 http://www.unkar.org/read/pc11.2ch.net/mac/1176452734 このページの166番付近です。
- harawo
- ベストアンサー率58% (3742/6450)
じっさいにXcodeで、例のコードを実行したら、テキストファイルに書き込んだ、整数値を出力してくれました。 Xcodeの「新規プロジェクト...」で、Application>Command Line Toolを指定し、「Type」を「C」にし、プロジェクトを作成すると、「Source」内に「main.c」ができています。main.cには「int main (int argc, const char * argv[])」で始まるmain関数が、あらかじめ記述されています。そこに例のコードを書き込み、コンソールで実行すると、正しく出力されます。 ※ご質問と直接関係ありませんが、Xcodeの最新バージョンは、3.2.3です。ADCに無料会員登録すると、ダウンロードできます。
補足
ご回答ありがとうございます! 本当ですか? じゃあ、input.txtを保存する場所がおかしいのでしょうか? プロジェクト名/build/Debug(実行ファイルがある場所)の中に保存してみても、 Segmentation fault と表示されます。 どうすれば良いのでしょう。 よければ教えて下さい! Xcodeが最新じゃないから・・・なんてことはないですよねf^^;
お礼
ありがとうございます! users/○○ と表示されました。 finderで開いてみるとその中に「output.txt」(他のプログラムで作ったもの)がありました! まさかそんな場所が指定されていたとは思っていなかったので、少し驚きました。 「コンソールで実行」と、実行ファイルから実行するのではカレントディレクトリが変わるなんて・・・。 おかげ様でモヤモヤが解決しました。 本当にありがとうございました。