アプリ版:「スタンプのみでお礼する」機能のリリースについて

xcodeでのファイル操作について

いろいろ自分で調べてみたのですが、
xcodeでファイル操作が上手く出来ません。

例えば、

#include <stdio.h>

int main () {
int x;
FILE *fp;
fp = fopen("input.txt", "r");
fscanf(fp,"%d", &x);
printf("%d",x);
fclose(fp);
return 0;
}

というプログラムを書いても、input.txtの内容によらず「0」と出力されます。
つまりinput.txtが開けていないということだと思うのですが、
どうすればちゃんと開けるようになるのでしょうか?
教えて下さい!

xcodeのバージョンは3.2.2です。

出来れば、ソースの方ではなく、xcodeの設定をいじってなんとかする方が良いです。

A 回答 (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で確認するのもよいでしょう。


>「プログラミングコンテストに提出する」

その「プログラミングコンテスト」とやらがどんなレギュレーションか、私を始めとする、回答者の誰も知らないと思います。
コマンドライン引数を使ってよいのかどうか、絶対パスは使えないのか、そういうこともわかりません。
    • good
    • 0
この回答へのお礼

ありがとうございます!

users/○○ と表示されました。
finderで開いてみるとその中に「output.txt」(他のプログラムで作ったもの)がありました!
まさかそんな場所が指定されていたとは思っていなかったので、少し驚きました。
「コンソールで実行」と、実行ファイルから実行するのではカレントディレクトリが変わるなんて・・・。

おかげ様でモヤモヤが解決しました。
本当にありがとうございました。

お礼日時:2010/09/15 20:32

追加:



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;
}

とすると、エラーメッセージが表示されるので、もう少しくわしくわかるかもしれません。
    • good
    • 0

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

補足日時:2010/09/13 21:13
    • good
    • 0

> しかし、いろいろしらべてみると、相対パスでもできるように設定できるようなことが書いてあったのですが、


> なかなかうまく行きません。

それに、どういう実用的な目的があるのでしょう?ないと、私は思いますが?

そもそもMacintosh上で動かすプログラムなら、GUIを備えていないと、実用性が著しく欠けます。GUIを備えるなら、Cocoa(Objective-Cで書かれたフレームワーク)かCarbon(C/C++で書かれたフレームワーク)を使って、アプリケーションを作ることになります。Cocoa、Carbonいずれも、ファイル管理をするためのクラスや関数が用意されているので、それを使って、対象ファイルの是対パスを、かんたんに取得できます。

意味のないことに、これ以上おつきあいするわけにはいきません。あしからず。

この回答への補足

>それに、どういう実用的な目的があるのでしょう?ないと、私は思いますが?

プログラミングコンテスト等で絶対パスを使うわけにはあまりいかないと僕は思うのです。

補足日時:2010/09/11 20:49
    • good
    • 0

> じゃあ、input.txtを保存する場所がおかしいのでしょうか?


> プロジェクト名/build/Debug(実行ファイルがある場所)の中に保存してみても、
> Segmentation fault
> と表示されます。

相対パスが通用するのかどうか、わたしは知りません。というか、通用しないものと思っています。
絶対パスでテキストファイルの場所を指定しては、いかがですか?

この回答への補足

ありがとうございます!

絶対パスで書くと正しく実行されました。

しかし、いろいろしらべてみると、相対パスでもできるように設定できるようなことが書いてあったのですが、
なかなかうまく行きません。

http://www.unkar.org/read/pc11.2ch.net/mac/11764 …
このページの166番付近です。

補足日時:2010/09/11 14:01
    • good
    • 0

じっさいに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^^;

補足日時:2010/09/11 11:30
    • good
    • 0

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