2009-05-16 17 views
38

私はファイルにデータを書き込むためにCを使用しています。私が今書いているものよりも長い場合に備えて、ファイルに書かれた前のテキストを消去したい。 ファイルのサイズを小さくしたい場合や、最後まで切り捨てたい場合があります。これどうやってするの?Cでファイルを切り詰めるには?

答えて

19

Windowsシステムでは何のヘッダ<unistd.h>はありませんが、まだあなたは、これが0バイトのサイズにファイルを切り捨て

_chsize(fileno(f), size); 
+5

_chsize_s 64ビット:_chsize_s(_fileno(f)、size); – Gyuri

+0

FILE構造体を使用すると_fileno関数が本当に役に立ちます – Carthi

+0

MS-Windowsのみの関数ではありませんか? –

12

これは、お使いのオペレーティングシステムの機能です。標準的なPOSIXの方法は次のとおりです:

open("file", O_TRUNC | O_WRONLY); 
+6

を使用してファイルを切り捨てることができます。 – chmike

4

ファイル全体を切り捨てたい場合は、ファイルを開いて書き込みを行います。それ以外の場合は、ファイルを開いて読み込み、一時変数に保存するファイルの部分を読み込み、必要な場所に出力する必要があります。ファイルの

FILE *file = fopen("filename.txt", "w"); //automatically clears the entire file for you. 

切り捨て部分:

FILE *inFile("filename.txt", "r"); 
//read in the data you want to keep 
fclose(inFile); 
FILE *outFile("filename.txt", "w"); 
//output back the data you want to keep into the file, or what you want to output. 
+5

これは非常に非効率的な方法です。 @ジョナサン・レフラーの方法がはるかに望ましいですし、あなたのプラットフォームがそれを許可しない場合、クラッシュの場合にデータロスを防止するために少なくとも書き込み/名前変更サイクルを実行してください(データを一時的な名前で新しいファイルにコピーし、 (可能であれば原子的に削除してから古いファイルを削除してください) – derobert

3

<編集>

ああ、あなたはあなたの投稿を編集し、あなたがCを使用している

ファイル全体を切り捨てファイルを開いたら、モード "w +"で開きます。書き込みの準備ができたら、ファイルを切り捨てます:

FILE* f = fopen("C:\\gabehabe.txt", "w+"); 
fclose(file); 

< /編集>

C++でファイルを切り捨てるために、あなたは単に、それを切り捨てるために、ファイルモードとしてios_base :: TRUNCを使用して、ファイルにofstreamのオブジェクトを作成することができます

ofstream x("C:\\gabehabe.txt", ios_base::trunc); 
+0

fopenはファイル "gabehabe.txt"の内容を切り捨て、ファイルポインタを先頭に置くでしょうか?しかし、ファイルポインタを再配置する前にファイルの内容を空にしますか? – Arpith

58

あなたは、その後、いくつかの長さ(他の回答を提供し、ゼロよりも大きい長さ、)、Pまでのファイルの以前の内容を保存したい場合は、次のようなので、 OSIXは、ジョブに対してtruncate()ftruncate()の機能を提供します。

#include <unistd.h> 
int ftruncate(int fildes, off_t length); 
int truncate(const char *path, off_t length); 

この名前は、ファイルの短縮という主な目的を示しています。しかし、指定された長さが以前の長さよりも長い場合、ファイルは新しいサイズに拡張されます(ゼロパディング)。 ftruncate()はファイル記述子で動作し、FILE *では動作しません。あなたが使用できます。

if (ftruncate(fileno(fp), new_length) != 0) ...error handling... 

をしかし、あなたは、単一のファイルにファイルストリーム(FILE *)とファイルディスクリプタ(int)を混合すると、アクセスが混乱を招く傾向にあることに注意する必要があります - 問題のいくつかのコメントを見ます。これは最後の手段でなければなりません。

しかし、あなたの目的のために、必要なものはすべて切り捨てる必要があります。そのためには、他の人が与えたオプションで十分です。

+0

2分先に...いいね! –

+0

著しく類似した、ランス!私たちの少なくとも1人はおそらく情報を正しいと思っています。 (を使用することは、より最近のPOSIX標準では必要ではないと考えられていますが、安全のためには何の害もありません) –

+1

C++ vs 2003ではこのような機能はありますか? 私は何かを逃したかもしれませんが含まれていますか? 私はwでファイルを開くのではなく、すでにファイルを開いています。 – sofr

5

これはUNIXのいくつかのフレーバーで実行する場合には、これらのAPIが利用可能であるべきである:

#include <unistd.h> 
    #include <sys/types.h> 

    int truncate(const char *path, off_t length); 
    int ftruncate(int fd, off_t length); 

は私のLinuxボックスの「男の切り捨て」によると、これらはPOSIX準拠しています。現在の長さよりも長い長さを渡すと、これらの呼び出しによって実際にファイルのサイズ(!)が増加することに注意してください。

関連する問題