- ベストアンサー
C言語---ファイルに出力したデータをすべて消去する方法
C言語の話です。 はじめ、ファイルを"w"モードで開き、 fprintfで繰り返してデータをファイルに書き込んで、 ある条件(何らかのエラーがおきた場合)には今まで書き込んだものは すべて 消去します。 (つまり、ファイルを再び空にするという意味です。) この場合、もうこれ以上ファイルに書き込むことはしないで、プログラムは終了します。 書き込んだものを消去するには、どのようにすればよいですか。 「一度ファイルを閉じて、再び"w"モードで開き、また閉じる」 というのが私が考えるいちばん簡単な方法なんですが、 ファイルの中身を消去するために開いたり閉じたりしなきゃいけないの? という気もします。 本で見ると、freopenという関数が使えそうな気もしますが、 わたしはこの関数を使ったことがありませんし、 解説を読んでも、本当にこのような場合に使うものなのかな、 という感じがします。 そんなにプログラミングに詳しくないので、やさしくご回答いただけるとたすかります。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
その時点で開いているファイル(書き込み中のファイル) のFile Descripterを閉じた後、 --- fclose(oldfp); FILE *fp = fopen(filename, "w"); fclose(fp); --- とするか、 --- freopen(filename, "w", oldfp); --- の何れかを実行すれば、ファイルサイズ0 (中身が空)のファイルが作成されます。 やはり一旦閉じた後、モード "w" で 再度開きなおすのがセオリーでしょう。
その他の回答 (5)
- madman
- ベストアンサー率24% (612/2465)
すみません、スペース(タブ?)が詰まってしまったようです。 >intunlink(const char *pathname); int unlink(const char *pathname); の間違いです。申し訳有りません。
- KojiS
- ベストアンサー率46% (145/312)
MS-Cなら、_chsizeというのもあるようです。 ファイルサイズを変更する関数ですが、試していないので0バイトにすることが可能かどうかはわかりません。 > int _chsize(int handle, long size); ただし、ファイルハンドルが必要なので、 > int _fileno( FILE *stream ); でファイルハンドルを取得してください。 他のC処理系はどうかわかりません。
- madman
- ベストアンサー率24% (612/2465)
消すだけなら #include <unistd.h> intunlink(const char *pathname); で、出来ます。ただし、ファイル毎消えます。 その後system()関数を用いて空ファイルを作成しては? system("touch filename");
補足
intunlinkですか。 これは標準関数なんでしょうか。 GoogleやGooなどで、intunlinkで検索したのですが、 みあたりませんでした。 ご回答ありがとうございました。
- punchan_jp
- ベストアンサー率55% (155/280)
UNIX なら ftruncate という、オープンされているファイルのサイ ズを変更する(縮めるか0で埋めて拡大する)システムコールがあ ります。Windows でもあるかもしれません。 ただし、ファイルを指定するには、FILE * のファイルポインタじゃ なくて、int のファイルディスクリプタを指定しますので、 fprintf で出力している場合は fflush して、吐き出したことを保 証してから、fileno でファイルディスクリプタを調べて、 ftruncate してから閉じてください。
補足
私は素人なのか、ファイルディスクリプタとかfilenoとか知りません。 調べてみたいと思います。 ありがとうございました。
- brogie
- ベストアンサー率33% (131/392)
単に削除するには以下の関数があります。 #include <stdio.h> int remove(const char *filename); 削除できたときは0を返す、出来なかったときは0以外を返す。
補足
早速のご回答ありがとうございます。 removeというのはファイルを削除する関数でしょうか。 この関数を使う前には、ファイルを閉じておかなければいけないんでしょうか。 本当は、 ファイル自体は残っていて、中身だけ空になってなおかつ閉じてくれるのがあるといいんですけど。 removeについて: http://www.bohyoh.com/CandCPP/C/Library/remove.html
お礼
>freopen(filename, "w", oldfp); >--- >の何れかを実行すれば、ファイルサイズ0 >(中身が空)のファイルが作成されます。 freopenは使えるんですね。 >やはり一旦閉じた後、モード "w" で >再度開きなおすのがセオリーでしょう。 やはりそうですか。ありがとうございました。