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の設定をいじってなんとかする方が良いです。
No.5ベストアンサー
- 回答日時:
ひとまず、カレントディレクトリがどうなっているか、チェックしてみましょう。
#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で確認するのもよいでしょう。
>「プログラミングコンテストに提出する」
その「プログラミングコンテスト」とやらがどんなレギュレーションか、私を始めとする、回答者の誰も知らないと思います。
コマンドライン引数を使ってよいのかどうか、絶対パスは使えないのか、そういうこともわかりません。
ありがとうございます!
users/○○ と表示されました。
finderで開いてみるとその中に「output.txt」(他のプログラムで作ったもの)がありました!
まさかそんな場所が指定されていたとは思っていなかったので、少し驚きました。
「コンソールで実行」と、実行ファイルから実行するのではカレントディレクトリが変わるなんて・・・。
おかげ様でモヤモヤが解決しました。
本当にありがとうございました。
No.6
- 回答日時:
追加:
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;
}
とすると、エラーメッセージが表示されるので、もう少しくわしくわかるかもしれません。
No.4
- 回答日時:
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
No.3
- 回答日時:
> しかし、いろいろしらべてみると、相対パスでもできるように設定できるようなことが書いてあったのですが、
> なかなかうまく行きません。
それに、どういう実用的な目的があるのでしょう?ないと、私は思いますが?
そもそもMacintosh上で動かすプログラムなら、GUIを備えていないと、実用性が著しく欠けます。GUIを備えるなら、Cocoa(Objective-Cで書かれたフレームワーク)かCarbon(C/C++で書かれたフレームワーク)を使って、アプリケーションを作ることになります。Cocoa、Carbonいずれも、ファイル管理をするためのクラスや関数が用意されているので、それを使って、対象ファイルの是対パスを、かんたんに取得できます。
意味のないことに、これ以上おつきあいするわけにはいきません。あしからず。
この回答への補足
>それに、どういう実用的な目的があるのでしょう?ないと、私は思いますが?
プログラミングコンテスト等で絶対パスを使うわけにはあまりいかないと僕は思うのです。
No.2
- 回答日時:
> じゃあ、input.txtを保存する場所がおかしいのでしょうか?
> プロジェクト名/build/Debug(実行ファイルがある場所)の中に保存してみても、
> Segmentation fault
> と表示されます。
相対パスが通用するのかどうか、わたしは知りません。というか、通用しないものと思っています。
絶対パスでテキストファイルの場所を指定しては、いかがですか?
この回答への補足
ありがとうございます!
絶対パスで書くと正しく実行されました。
しかし、いろいろしらべてみると、相対パスでもできるように設定できるようなことが書いてあったのですが、
なかなかうまく行きません。
http://www.unkar.org/read/pc11.2ch.net/mac/11764 …
このページの166番付近です。
No.1
- 回答日時:
じっさいに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^^;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
xcopyで特定のファイルのみをコ...
-
echo "abc" >> test.txt で、先...
-
コマンドにてテキストファイル...
-
echoの出力の最後のスペースを...
-
リダイレクト >> を複数のファ...
-
NULLの置き換えについて
-
バッチファイルで改行の出力
-
bat処理の実行結果ログ出力方法...
-
バッチファイル 現在のフォルダ...
-
ファイル名の一部を変更するバ...
-
シェルから引数を使用してsedコ...
-
特定のファイルだけをサブディ...
-
ファイルを行ごとに比較するシ...
-
コマンドプロンプトで相対パス...
-
FTPのバッチファイルで日付を引...
-
ACCESSからテキストファイルへ...
-
複数のテキストファイルをひと...
-
コマンドプロンプトでFTPでエラー
-
バッチファイル 指定行の切り出し
-
コマンドプロンプトで標準エラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
xcopyで特定のファイルのみをコ...
-
バッチファイル 指定行の切り出し
-
echoの出力の最後のスペースを...
-
echo "abc" >> test.txt で、先...
-
バッチファイルで改行の出力
-
コマンドプロンプトで相対パス...
-
【VBA】テキストファイルから特...
-
コマンドプロンプトで標準エラ...
-
コマンド実行結果を環境変数に...
-
batファイルの結果をテキストに...
-
コマンドにてテキストファイル...
-
txtって、 Microsoft Wordの状...
-
bat処理の実行結果ログ出力方法...
-
bashで、gotoのようなラベルに...
-
R18文学賞は400字詰め換算で(2...
-
NULLの置き換えについて
-
FTPのバッチファイルで日付を引...
-
バッチコマンドの「set」で入力...
-
.txtって、縦書きにはならない...
-
バッチファイル 現在のフォルダ...
おすすめ情報