OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

C言語---ファイルに出力したデータをすべて消去する方法

  • 暇なときにでも
  • 質問No.100646
  • 閲覧数3910
  • ありがとう数3
  • 気になる数0
  • 回答数6
  • コメント数0

C言語の話です。

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

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

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

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

そんなにプログラミングに詳しくないので、やさしくご回答いただけるとたすかります。
通報する
  • 回答数6
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.4
レベル12

ベストアンサー率 41% (324/772)

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

やはり一旦閉じた後、モード "w" で
再度開きなおすのがセオリーでしょう。
お礼コメント
noname#836

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

freopenは使えるんですね。

>やはり一旦閉じた後、モード "w" で
>再度開きなおすのがセオリーでしょう。
やはりそうですか。ありがとうございました。
投稿日時 - 2001-07-08 09:28:09
-PR-
-PR-

その他の回答 (全5件)

  • 回答No.1
レベル11

ベストアンサー率 33% (131/392)

単に削除するには以下の関数があります。 #include <stdio.h> int remove(const char *filename); 削除できたときは0を返す、出来なかったときは0以外を返す。 ...続きを読む
単に削除するには以下の関数があります。

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

削除できたときは0を返す、出来なかったときは0以外を返す。
補足コメント
noname#836

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

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


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

removeについて:
http://www.bohyoh.com/CandCPP/C/Library/remove.html
投稿日時 - 2001-07-06 23:58:54
  • 回答No.2
レベル11

ベストアンサー率 55% (155/280)

UNIX なら ftruncate という、オープンされているファイルのサイ ズを変更する(縮めるか0で埋めて拡大する)システムコールがあ ります。Windows でもあるかもしれません。 ただし、ファイルを指定するには、FILE * のファイルポインタじゃ なくて、int のファイルディスクリプタを指定しますので、 fprintf で出力している場合は fflush して、吐き出したことを ...続きを読む
UNIX なら ftruncate という、オープンされているファイルのサイ
ズを変更する(縮めるか0で埋めて拡大する)システムコールがあ
ります。Windows でもあるかもしれません。

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

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

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

ありがとうございました。
投稿日時 - 2001-07-07 00:11:45
  • 回答No.3
レベル14

ベストアンサー率 24% (612/2465)

消すだけなら #include <unistd.h> intunlink(const char *pathname); で、出来ます。ただし、ファイル毎消えます。 その後system()関数を用いて空ファイルを作成しては? system("touch filename"); ...続きを読む
消すだけなら

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

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

その後system()関数を用いて空ファイルを作成しては?
system("touch filename");
補足コメント
noname#836

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

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

ご回答ありがとうございました。
投稿日時 - 2001-07-07 00:17:56
  • 回答No.5
レベル11

ベストアンサー率 46% (145/312)

MS-Cなら、_chsizeというのもあるようです。 ファイルサイズを変更する関数ですが、試していないので0バイトにすることが可能かどうかはわかりません。 > int _chsize(int handle, long size); ただし、ファイルハンドルが必要なので、 > int _fileno( FILE *stream ); でファイルハンドルを取得してください。 ...続きを読む
MS-Cなら、_chsizeというのもあるようです。
ファイルサイズを変更する関数ですが、試していないので0バイトにすることが可能かどうかはわかりません。

> int _chsize(int handle, long size);

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

他のC処理系はどうかわかりません。
  • 回答No.6
レベル14

ベストアンサー率 24% (612/2465)

すみません、スペース(タブ?)が詰まってしまったようです。 >intunlink(const char *pathname); int unlink(const char *pathname); の間違いです。申し訳有りません。
すみません、スペース(タブ?)が詰まってしまったようです。

>intunlink(const char *pathname);
int unlink(const char *pathname);
の間違いです。申し訳有りません。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ