これまでで一番「情けなかったとき」はいつですか?

C言語の話です。

はじめ、ファイルを"w"モードで開き、
fprintfで繰り返してデータをファイルに書き込んで、
ある条件(何らかのエラーがおきた場合)には今まで書き込んだものは
すべて 消去します。
(つまり、ファイルを再び空にするという意味です。)
この場合、もうこれ以上ファイルに書き込むことはしないで、プログラムは終了します。

書き込んだものを消去するには、どのようにすればよいですか。

「一度ファイルを閉じて、再び"w"モードで開き、また閉じる」
というのが私が考えるいちばん簡単な方法なんですが、
ファイルの中身を消去するために開いたり閉じたりしなきゃいけないの?
という気もします。

本で見ると、freopenという関数が使えそうな気もしますが、
わたしはこの関数を使ったことがありませんし、
解説を読んでも、本当にこのような場合に使うものなのかな、
という感じがします。

そんなにプログラミングに詳しくないので、やさしくご回答いただけるとたすかります。

A 回答 (6件)

その時点で開いているファイル(書き込み中のファイル)


のFile Descripterを閉じた後、
---
fclose(oldfp);
FILE *fp = fopen(filename, "w");
fclose(fp);
---
とするか、
---
freopen(filename, "w", oldfp);
---
の何れかを実行すれば、ファイルサイズ0
(中身が空)のファイルが作成されます。

やはり一旦閉じた後、モード "w" で
再度開きなおすのがセオリーでしょう。
    • good
    • 0
この回答へのお礼

>freopen(filename, "w", oldfp);
>---
>の何れかを実行すれば、ファイルサイズ0
>(中身が空)のファイルが作成されます。

freopenは使えるんですね。

>やはり一旦閉じた後、モード "w" で
>再度開きなおすのがセオリーでしょう。
やはりそうですか。ありがとうございました。

お礼日時:2001/07/08 09:28

すみません、スペース(タブ?)が詰まってしまったようです。



>intunlink(const char *pathname);
int unlink(const char *pathname);
の間違いです。申し訳有りません。
    • good
    • 0

MS-Cなら、_chsizeというのもあるようです。


ファイルサイズを変更する関数ですが、試していないので0バイトにすることが可能かどうかはわかりません。

> int _chsize(int handle, long size);

ただし、ファイルハンドルが必要なので、
> int _fileno( FILE *stream );
でファイルハンドルを取得してください。

他のC処理系はどうかわかりません。
    • good
    • 0

消すだけなら



#include <unistd.h>
intunlink(const char *pathname);

で、出来ます。ただし、ファイル毎消えます。

その後system()関数を用いて空ファイルを作成しては?
system("touch filename");

この回答への補足

intunlinkですか。
これは標準関数なんでしょうか。

GoogleやGooなどで、intunlinkで検索したのですが、
みあたりませんでした。

ご回答ありがとうございました。

補足日時:2001/07/07 00:17
    • good
    • 0

UNIX なら ftruncate という、オープンされているファイルのサイ


ズを変更する(縮めるか0で埋めて拡大する)システムコールがあ
ります。Windows でもあるかもしれません。

ただし、ファイルを指定するには、FILE * のファイルポインタじゃ
なくて、int のファイルディスクリプタを指定しますので、
fprintf で出力している場合は fflush して、吐き出したことを保
証してから、fileno でファイルディスクリプタを調べて、
ftruncate してから閉じてください。

この回答への補足

私は素人なのか、ファイルディスクリプタとかfilenoとか知りません。

調べてみたいと思います。

ありがとうございました。

補足日時:2001/07/07 00:11
    • good
    • 0

単に削除するには以下の関数があります。



#include <stdio.h>
int remove(const char *filename);

削除できたときは0を返す、出来なかったときは0以外を返す。

この回答への補足

早速のご回答ありがとうございます。

removeというのはファイルを削除する関数でしょうか。
この関数を使う前には、ファイルを閉じておかなければいけないんでしょうか。


本当は、
ファイル自体は残っていて、中身だけ空になってなおかつ閉じてくれるのがあるといいんですけど。

removeについて:
http://www.bohyoh.com/CandCPP/C/Library/remove.h …

補足日時:2001/07/06 23:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A