ページ 11

ファイルのオープンモードについて

Posted: 2009年10月23日(金) 10:23
by LUNA
少し質問です。
ファイルの入出力について勉強しているときにfopenのオープンモードについて疑問に思ったんですが、
今使っているテキストに
"w"書き込み用にテキストファイルをオープンする。
"r"読み込み用にテキストファイルをオープンする。
"a"追記用にテキストファイルをオープンする。

"w+"『更新用』にテキストファイルをオープンする。(新規作成)
"r+"『更新用』にテキストファイルをオープンする。(ファイルを開く)
"a+"『更新』の為、追記用にテキストファイルをオープンする。

と、書かれていました。
"w"と"r"については理解できたのですが"w+","r+","a+"等の『更新用』と言う部分がいまいちわかりません。
『更新』とは? 実際に使うとき、上記の"w","r","a"だけではダメなのでしょうか?
また追記用の"a","a+"の使い方もいまいち理解できてないのでどなたか使用例を教えてもらえないでしょうか?
お願いします。

Re:ファイルのオープンモードについて

Posted: 2009年10月23日(金) 10:56
by toyo
更新用という表現はしっくりこないですね
rは読み込み、r+は読み込みおよび書き込み
wは書き込み、w+は書き込みおよび読み込み
aは追記、a+は追記および読み込み
です。
入出力のバッファが読み込みと書き込みで別と考えればいいと思います。
"w"では書き込みバッファのみ作られる
"w+"だと書き込み用と読み込み用バッファが作られる
#include <stdio.h>

int main(void)
{
	FILE* fp;
	char buf[256] = "hoge";

	fp = fopen("test.txt", "w");
	fputs("test", fp);
	fseek(fp, 0, SEEK_SET);
	if (fgets(buf, 256, fp) == NULL)
	{
		printf("error\n");
	}
	fclose(fp);
	printf("%s", buf);
	return 0;
}
上記のサンプルだと書き込んだ文字列を再読込しようとしても出来ませんがオープンモードを"w+"にすると読み込めるようになります。

Re:ファイルのオープンモードについて

Posted: 2009年10月23日(金) 11:04
by バグ
こんな感じでしょうか?
┏━━┳━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃引数┃モード      ┃ファイルが存在しない場合  ┃ファイルが存在する場合            ┃
┣━━╋━━━━━━╋━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━┫
┃"r" ┃読み込み    ┃エラー                    ┃                                  ┃
┣━━╋━━━━━━╋━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━┫
┃"w" ┃書き込み    ┃新規にファイルが作成される┃ファイルの中身が失われる          ┃
┣━━╋━━━━━━╋━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━┫
┃"a" ┃追加書き込み┃新規にファイルが作成される┃ファイルの末尾からデータを追加する┃
┣━━╋━━━━━━╋━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━┫
┃"r+"┃読み書き    ┃エラー                    ┃                                  ┃
┣━━╋━━━━━━╋━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━┫
┃"w+"┃読み書き    ┃新規にファイルが作成される┃ファイルの中身が失われる          ┃
┣━━╋━━━━━━╋━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━┫
┃"a+"┃追加読み書き┃新規にファイルが作成される┃ファイルの末尾からデータを追加する┃
┗━━┻━━━━━━┻━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━┛

┏━━━━┳━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃追加文字┃モード  ┃機能                                                      ┃
┣━━━━╋━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃"b"     ┃バイナリ┃ファイルのデータをそのまま読み込む                        ┃
┣━━━━╋━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃"t"     ┃テキスト┃テキストファイル上の「改行」コードをプログラムで利用できる┃
┃        ┃        ┃「\n」に変換してデータを読み込む                          ┃
┗━━━━┻━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Re:ファイルのオープンモードについて

Posted: 2009年10月23日(金) 11:32
by LUNA
なるほど。a+,w+は読み込みが、r+は書き込みのバッファがさらに作られるんですね。

バグさん。
わざわざ表まで作っていただきありがとうございます。
とても見やすくてわかりやすいですw
これで疑問がある程度解けました。
あとはこっちで何とかしてみようかと思います。