[Xcode]ファイル操作を初めてしたときにつまづいたこと。[画像付き]
こんにちは。シュモクザメです。
僕は普段macのXcodeでC言語のプログラミングを行っているのですが、
大学の講義で初めてファイルを扱う課題が出ました。
そのときに最初つまづいたことを少し紹介します。
同じことで悩んでいる人の助けになれた良いです。
まずファイルの概念がわからない
とりあえずこれでした。
ファイルって単語は知ってますし、
授業中に出てきたfopen関数などもファイルを指定して開いて色々できるってのは理解できました。
ただ、ファイルって具体的に何なん?ファイルとは?ってことです。
なにかC言語では専用のそういうファイルが有るのか?
(いやでもCファイルはC言語のコードを格納するものだしな…)
結論、ファイルっていうのは何でも良いです
まあ何でも良いってのは言いすぎなんですけど。
とりあえず専用の、それじゃないとだめ!みたいなファイルとかがあるわけじゃいです。
具体的には.txtファイルとかです。てかべつに拡張子がなくても良いです。
(.txtファイルとか.rtxファイルはmacのテキストエディタで簡単に作成できます)
まあどういうノリなんかって言うと
たぶんファイルを扱う前までのC言語だと
入力はキーボードで画面に打ち込んでプログラムに渡す、
返ってきた結果は画面に表示される(Xodeだと下の画面、ターミナルだとウインドウの中)
でした。
それを標準入力、標準出力っていいます。
基本的に何も指定しなければプログラムは標準入力(キーボードなど)と標準出力(画面など)で動作します。
ファイルを扱うっていうのはその出力と入力を変更するということです。
例えば 1 + 1を計算するプログラムがあれば
標準出力なら画面に 2 が、
出力をfprintfでファイルにしていればファイルに 2 が、
書き込まれるということです。
入力も同じで、普段僕たちがキーボードで打ち込んでエンターキーを押しているものを、代わりにファイルの中に書かれているものを入力しているのと変わらないです。
つまりファイルっていうのは、
計算や文字などの出力を書き込めて、それを扱える文字や数字で入力に使えるものなら何でも良いです。
はじめファイルを扱うときこれが分かりませんでした…
Xcodeでファイルが開けない
ファイルを理解したあと早速ファイル操作をやろうと思ったのですがうまくいきませんでした。
具体的には存在しているはずのファイルが開けませんでした。
え、ちゃんと一字一句あってるやんって思ってたんですけど失敗するのでググりまくってなんとかわかりました。
Working directory(作業ディレクトリ)の場所を指定していない
ということです。
?????という人もいると思います。
とりあえずディレクトリっていうのはコンピュータ内の領域って思えばよいです。
そんでWorking directoryっていうのはそのプログラム自体を動かす領域のことです。
つまりその領域内に指定するファイルが無ければ、プログラムはそのファイル認識できないってことですね。
またプログラム内で新しくファイルを作成する場合はその領域内に作成されます。
じゃあ具体的にどうすればええねんって話ですよね。
説明します。
とりあえず扱いたいファイルを作成して、デスクトップのフォルダに入れておきます。
次にXcodeを開いて、画面の上のメニューバーから
Product
Scheme
Edit Scheme
の順に選択します

そしてその後
Optionsを選んで
Use custom working directoryにチェックをいれて
ファイルが入ってるフォルダを選択する
だけです。

画像の青色で囲ってある部分です。超簡単ですね。
これでファイルを扱えるようになりました。
簡単なコード紹介
#include <stdio.h>
int main(void) {
FILE *fp;
int i;
if((fp=fopen("aa.txt","w"))==NULL){
fprintf(stderr, "Cannot open\n");
exit(-1);
}else
for(i=0; i<3; i++)
fprintf(fp,"%d ",i);
fclose(fp);
int x[3];
if((fp=fopen("aa.txt","r"))==NULL){
fprintf(stderr, "Cannot open\n");
exit(-1);
}else
for(i=0; i<3; i++)
fscanf(fp,"%d ",&x[i]);
printf("%d %d %d\n",x[0],x[1],x[2]);
fclose(fp);
return 0;
}
配列xは標準入力では値を入れてませんが、しっかりファイルを通して値を受け取っています。
今回はこれで終わりです
ではまた。