第50章 低水準ファイル入出力 その1


高水準ファイル入出力については、第18章第19章第20章で扱いました。 そもそも、高水準とか低水準とかいうのは何のことなのでしょうか。 高水準ファイル入出力では、ファイルに書き込みをするときも 直接ディスクに書き込んでいるわけではありません。 OSの用意したバッファを介して行っています。 これに対して、低水準の方はよりOSに近いレベルの入出力です。

そんな説明じゃよくわからん!

はい。これ以上の詳しい説明は参考書を読んでください。 プログラムを書く上では、あんまり役に立たない知識です。 では、本題に入ります。 ファイルのオープンは、次のように行います。

hdl = open("filename", O_CREAT など);


ここで、hdlとはint型の整数です。ファイルハンドルと言って この後、ファイルの読み書きの時必要です。 「O_CREATなど」とあるのは、fcntl.hで 次のように定義されています。

#define _O_RDONLY 0x0000 /* open for reading only */ #define _O_WRONLY 0x0001 /* open for writing only */ #define _O_RDWR 0x0002 /* open for reading and writing */ #define _O_APPEND 0x0008 /* writes done at eof */ #define _O_CREAT 0x0100 /* create and open file */ #define _O_TRUNC 0x0200 /* open and truncate */ #define _O_EXCL 0x0400 /* open only if file doesn't already exist */ #define _O_TEXT 0x4000 /* file mode is text (translated) */ #define _O_BINARY 0x8000 /* file mode is binary (untranslated) */

必要なものをOR(|)で結んでやればOKです。これは、前章で 少しだけ関係のあることを書いています。 それと、注意しなくてはいけないのは、VC++ではこの関数の 前にアンダースコアがついています。これは、低水準なので なるべく別の関数(高水準の)を使って下さいという意味です。 でも気にせず使ってしまいましょう。また、_open()とせずに open()としても、エラーにはなりません。 似たようなものにgetch()があります。これもアンダスコア付き 関数ですがgetch()のまま使っても問題ありません。 O_APPENDなどの定数類もアンダスコアがついています。 取ってしまっても差し支えありません

では、さっそく氏名と、成績(得点)をファイルに書き込む プログラムを作ってみましょう。openしたら、write関数で ファイルに書き込むだけです。終わったら当然closeします。 それと、低水準ファイル入出力を行うには、インクルードする ファイルがいろいろあるので注意して下さい。

#include <stdio.h> #include <io.h> #include <stdlib.h> #include <fcntl.h> #include <sys\types.h> #include <sys\stat.h> int main(void) { int hdl; char name[32], point[6], fname[16]; printf("ファイル名="); gets(fname); hdl = _open(fname, O_CREAT | O_WRONLY | O_APPEND); printf("Eで終了します\n"); while(1) { memset(name, '\0', 32); memset(point, '\0', 6); printf("氏名="); gets(name); if (strcmp(name, "E") == 0) break; printf("得点="); gets(point); _write(hdl, name, 31); _write(hdl, point, 5); } _close(hdl); return 0; }


memsetでnameやpointの配列の要素をすべてヌル文字で埋めて、 ファイルにゴミを書き込まないようにしています。(memsetはあとの章で出てくる予定)

別にどうということはありませんね。次回は、このファイルを 読み出すプログラムを作ります。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Feb/17/1997 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。