C言語関係掲示板

過去ログ

No.315.新規ファイルと既存ファイルのオープン

[戻る] [ホームページ]
No.1950

ファイルIOについて
投稿者---えいじ(2002/07/04 20:33:01)


MS-Cでファイル作成プログラムを作成しているのですが
低水準のopen関数で悩んでいます。
何もないところから新規にファイルをオープンする場合と
既にあるファイルをオープンする場合で
open関数の引数を変えているのですが期待値通りになりません。
ちなみに既になる場合は、内容を破棄して新たに書き込みます。
新規作成時は、O_WRONLY | O_CREAT | O_EXCL | O_BINARY
既存時は、 O_WRONLY | O_TRUNC | O_BINARY
ファイルは、バイナリファイルです。
新規作成時は、できるのですが同一ファイルに対してopenすると権限がないやすでに存在しますなのでエラーが発生します。何が悪いかわからないのでサンプルなどがあれば教えてください。 c言語は、未だ初心者です。説明不足で申し訳御座いませんが宜しくお願い致します



No.1958

Re:ファイルIOについて
投稿者---かずま(2002/07/04 23:53:30)


> 新規作成時は、できるのですが同一ファイルに対してopenすると
> 権限がないやすでに存在しますなのでエラーが発生します。

MS-C ではなく、Windows 2000 の Visula C++ 6.0 なので違うのかもしれませんが、
次のプログラムではエラーが出ません。もちろん、同じプログラムをもう一度動かすと、
O_CREAT: File exists のメッセージが出るのは言うまでもありません。
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    int fd;

    fd = open("file.dat", O_WRONLY | O_CREAT | O_EXCL | O_BINARY, S_IREAD | S_IWRITE);
    if (fd < 0) { perror("O_CREAT"); return 1; }
    close(fd);
    fd = open("file.dat", O_WRONLY | O_TRUNC | O_BINARY);
    if (fd < 0) { perror("O_TRUNC.dat"); return 1; }
	close(fd);
    return 0;
}

質問するときは、エラーの出るプログラムと、実行時のエラーメッセージをそのまま改変せずに
提示すべきです。「説明不足で申し訳御座いませんが」なんて弁解するのは無意味です。