こんにちは。シュモクザメです。
僕は普段macのXcodeでC言語のプログラミングを行っているのですが、
大学の2回生の講義で初めてファイルを扱う課題が出ました。

そもそもファイルって何のこと?

一応コードはうまくかけてるはずなのにファイルが開けない…
などなど当時最初につまづいたことを少し紹介します。
同じことで悩んでいる人の助けになれた良いです。
まずファイルの概念がわからない
とりあえずこれでした。
ファイルって単語は知ってますし、
授業中に出てきたfopen関数などもファイルを指定して開いて色々できるってのは理解できました。
ただ、

ファイルって具体的に何なん?ファイルとは?
ってことです。

なにかC言語では専用のファイルと呼ばれているものが有るのか?
(Cファイルは知っているけどそれはC言語のコードを格納するものだしな…)
結論、ファイルっていうのは文字や数字を書き込みできるなら何でも良いです
まあ何でも良いってのは言いすぎなんですけど。
いわゆるただのメモ帳とかノートみたいなもんですね。
とりあえず、専用のそれじゃないとだめ!みたいなファイルとかがあるわけじゃいです。
具体的には.txtファイルとかです。てかべつに拡張子がなくても良いです。
(.txtファイルとか.rtxファイルはmacのテキストエディタで簡単に作成できます)

まあどういうノリなんかって言うと
たぶんファイルを扱う前までのC言語だと
入力はキーボードで画面に打ち込んでプログラムに渡す、
返ってきた結果は画面に表示される(Xodeだと下の画面、ターミナルだとウインドウの中)
でした。

それを標準入力、標準出力っていいます。
基本的に何も指定しなければプログラムは標準入力(キーボードなど)と標準出力(画面など)で動作します。
ファイルを扱うっていうのはその出力と入力を変更するということです。
(fprintfとfscanfを使う場合ね)
例えば 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は標準入力では値を入れてませんが、しっかりファイルを通して値を受け取っています。
今回はこれで終わりです
ではまた。
コメント