2016-06-21 6 views
0

open()でファイルを開く。open()を既存のファイルを切り捨てる方法

ファンクションが既に存在する場合は、ファイル内容を破棄してから新しい空のファイルとして扱いたいと考えています。

私は次のコードで試してみました:

int open_file(char *filename) 
{ 
    int fd = -1; 
    fd = open(filename, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); 
    if (fd < 0) { 
     printf("Couldn't create new file %s: %s\n", 
      filename, strerror(errno)); 
     return -1; 
    } 
    close(fd); 
    return 0; 
} 

が、私は次のエラーました:

Couldn't create new file kallel333: File exists 

私は何をしないのですか?

+0

ファイルを削除または切り捨てますか。 – sas

+4

O_TRUNCフラグを追加しようとしましたか? – sas

+0

@sas何でも、目標は新しい空の開いたファイルを持つことです。私はこのエラーを取得したくない – MOHAMED

答えて

5

O_TRUNCフラグを追加し、O_EXCLを削除してください。オープンmanページから

open(filename, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); 

-

O_EXCLこの呼び出しは、ファイルを作成していることを確認してください:このフラグはO_CREATと一緒に指定 で、パス名がすでに (オープン、その後、存在する場合は)失敗します。

O_TRUNC ファイルがすでに存在している通常のファイルおよび アクセスモード(すなわち、O_RDWRまたはO_WRONLYである)を書き込むことができた場合には、 問題がO_EXCLフラグである長さ

2

open()のマニュアルページには、これはO_TRUNCフラグについてこう述べています。

O_TRUNC If the file already exists and is a regular file and the open mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be truncated to length 0. If the file is a FIFO or terminal device file, the O_TRUNC flag is ignored. Otherwise the effect of O_TRUNC is unspecified.

+0

それはその一部ですが、その一部だけです。 'O_EXCL'も削除しなければなりません。ファイルが存在する場合、ファイルが既に存在する場合、切り詰めが起こる前にファイルを開くことができないからです。可能であれば、あなたが調べたマニュアルページのオンライン版へのリンクを提供することは良い考えであることに注意してください。 Linuxでは、多くの場合、マニュアルページのソースとしてhttp://linux.die.net/を使用できますが、多くの選択肢があります。 –

3

に切り捨てられます。 open(2)のmanページから:

O_EXCL Ensure that this call creates the file: if this flag is specified in conjunction with O_CREAT, and pathname already exists, then open() will fail.

私はO_TRUNCを追加し、再試行、O_EXCLを削除することをお勧めします。

0

このエラーの概要を教えてください。 Open関数は戻り値の型をとります。つまり、このシステムコールの実行後に値が返されます(あなたの場合はfdに格納されます)。 この値は、システムコールの実行が成功したかどうかを示します()。 openシステムコールが失敗した場合、は、関数int fd = -1;の最初の文で既に初期化している-1(fdへ)を自動的に返します。したがって、文if (fd < 0)が正しいと検証されているため、そのエラーが発生しています。 システムコールの戻り値は設定しないでください。プログラムの実行時に自動的に返されます。あなたがしなければならないのは、その価値を捉えてそれを検証することだけです。したがって、関数int fd = -1の最初の文をint fdに変更してください。

ボトムライン:あなたは、その作成は任意のコストで失敗するコンパイラを伝えるには-1、それによってopenシステムコールの戻り値を設定しています!権限については、他のコメントを参照してください!!:)

関連する問題