C言語の話です。

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

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

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

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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「古い圧縮ファイル」の確認方法

Dドライブのディスクのクリーンアップをしたいのですが、実行できるものが、「古い圧縮ファイル」の削除しかありません。

「古い圧縮ファイル」がどのプログラムかを確認する方法を教えてください。

また、圧縮されたファイルの名前は青くなるらしいのですが、見つかりません。どうしてでしょうか
圧縮ファイルは1G弱あります。

Aベストアンサー

http://www.atmarkit.co.jp/fwin2k/win2ktips/106cleanup/106cleanup.html

初期設定では、50日以上アクセスの無かったファイルに対して、圧縮が行われます。
当然、圧縮してからでないと、ファイル名は青色にはなりませんので、ディスク・クリーンアップでの候補段階では、黒色のままです。


尚、設定によっては青色表示にならない場合も有りますけど。

http://121ware.com/qasearch/1007/app/nec.jsp?005084

Qfprintfで微小な数値を書き込む場合??

fprintf( fp, "%10.20f, %2.20f, %2.20f\n", b,c,d);
としてb,c,dの値を書きこもうとしました。


しかし、c,dの値が小さくて0になってしまいました。
どのように改善すればいいのですか?分かる方がいたら教えていただけないでしょうか?
よろしくお願いします。

ちなみにc,dの値は0.000000023などです。

Aベストアンサー

ご質問がすべて正しいとすると、コンパイラや実行環境が
そういう仕様なのでは?
OSやコンパイラには何をお使いでしょうか?

ちなみに手元のCentos5.5+gcc4.1.2では正常に動作するようです。

[localhost tmp]$ cat test.c
#include <stdio.h>
int main(int argc, const char *argv[])
{
float b,c,d;
FILE *fp = fopen("output.txt", "w");
b = c = d = 0.000000023f;
fprintf(fp, "%10.20f, %2.20f, %2.20f\n", b,c,d);
fclose(fp);
}
[localhost tmp]$ ./test
[localhost tmp]$ cat output.txt
0.00000002300000012667, 0.00000002300000012667, 0.00000002300000012667

Qファイルの圧縮方法

AVIやMPGの画像ファイルを圧縮する方法を教えてください。900mb位のファイルをCD-Rに落とし込める700mbまで圧縮したいんですが。できれば、zipやlzhなどの後で解凍しなくてはいけないような圧縮方法ではなく、多少画像が荒くなってもファイルを単純に縮小させるような方法を教えていただけると有り難いのですが。。
因みに、TMPGEncを試してみたんですが、どうもうまくいかなくて。。ファイルサイズが元のファイルより逆に大きくなってしまうんです。
すいませんが、宜しくお願いします。

Aベストアンサー

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450 450 くらいでカット。
対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331
ではでは!

追伸
カンタンにならrmファイルに変更かなあ
でも画質は落ちますよ
ネット配信 ストリーミング形式でどぞ!
RealplusG2とかRealEncoderで変換
でもaviでもないしmpegでもないですけど、どお?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450...続きを読む

Q空白を含む文をファイルに書き込んで10文字ずつ読み出す

空白を含む文を10文字ずつ読み出そうとしています。でも

文1:I am a poor programmer.
文2:2nd Sentence
結果:2nd Sentenr programmer.

となります。"I am a poo"が欲しいのですが。
800文字以内にするためにmainだけにしました。後で補足できます。

int main()
{
sentence sntc;
fstream file;

file.open("SENTENCE.TXT", ios::app | ios::out | ios::in | ios::binary );

sntc.getData();
file.write( reinterpret_cast<char*>(&sntc), sizeof(sntc) );

file.seekg(0, ios::end);
int endposition = file.tellg();
int n = endposition / sizeof(sentence);
cout << "\nThere are " << n << " sentences in file";

cout << "\nEnter sentence number: ";
cin >> n;
int position = (n-1) * sizeof(sentence);
file.seekg(position);

file.read( reinterpret_cast<char*>(&sntc), sizeof(sntc) );
sntc.showData();
cout << endl;

file.seekg(position, ios::cur);
file.read( reinterpret_cast<char*>(&sntc), 10);
sntc.showData();
cout << endl;
return 0;
}

空白を含む文を10文字ずつ読み出そうとしています。でも

文1:I am a poor programmer.
文2:2nd Sentence
結果:2nd Sentenr programmer.

となります。"I am a poo"が欲しいのですが。
800文字以内にするためにmainだけにしました。後で補足できます。

int main()
{
sentence sntc;
fstream file;

file.open("SENTENCE.TXT", ios::app | ios::out | ios::in | ios::binary );

sntc.getData();
file.write( reinterpret_cast<char*>(&sntc), sizeof(sntc) );

file.s...続きを読む

Aベストアンサー

ひさしぶりにストラウストラップ本を見返してみました。
やはり、readでは\0が付加されないようです。
(『プログラミング言語C++第3版』§21.3.4)

seekgの前でちゃんと表示されたのは、ファイルからではなく、
getData()によって入力されたからでしょう。
この場合、自動的にヌルが付加されます。

ファイル読み込みに、read()ではなく、
getline()を使うと良いと思います。

ただ、やっぱりこのキャストはおかしい。
こうやって入力すると、たまたまsentence内のstrに
データが入るかもしれませんが、
オブジェクトの使い方としてはいただけません。

代案として、
(1)strをpublicにして、
file.getline(sntc.str, 11);
のようにする。

(2)バッファを使い、sentenceにsetStr, getStrメソッドを付加して、
char buf[80];
file.getline(buf, 11);
sntc.setStr(buf);
のようにする。

これ以上はわからないので、
C++に詳しい人の登場を待ちます。

ひさしぶりにストラウストラップ本を見返してみました。
やはり、readでは\0が付加されないようです。
(『プログラミング言語C++第3版』§21.3.4)

seekgの前でちゃんと表示されたのは、ファイルからではなく、
getData()によって入力されたからでしょう。
この場合、自動的にヌルが付加されます。

ファイル読み込みに、read()ではなく、
getline()を使うと良いと思います。

ただ、やっぱりこのキャストはおかしい。
こうやって入力すると、たまたまsentence内のstrに
データが入るかもしれませんが...続きを読む

Qファイルの圧縮方法が解りません

窓の杜やベクター等に置かれている、フリーの圧縮、解凍ソフトをダウンロードしていますが、テキストファイルや、画像ファイルの圧縮方法が解りません。何方か教えて頂けませんか?

Aベストアンサー

ソフトの開発者のサイトで質問することをお奨めします。

ソフトごとに操作方法が異なりますので、使用しているソフト名すらない状態では誰も必要とする回答を出せません。

窓の杜やベクターでは開発者のサイトへのリンクがありますから、そこからアクセスできますよ。

Q開いたファイルを閉じるには?

Cのプログラムで
system関数を使うとDOSコマンドが使えるので、
txtファイルを(ノートパッド)開くことができます。

開いたtxtファイルを
Cのプログラムまたは、DOSコマンドで
閉じるのには、どうしたら良いですか?

教えてください。
お願いしますm(._.)m
(不可能ならば、不可能と教えてください。)

Aベストアンサー

こんにちわ。
#1 muyoshid です。

以下に、プロセス起動のサンプルを挙げて起きます。

cmdline に、実行するコマンドのコマンドラインを渡すと、関数の復帰値で
プロセス起動の成功/失敗が分かります。
プロセスの起動に成功した場合、アウトパラメータで起動されたプロセスの
プロセスハンドルが帰ってきますので、プロセス終了時には
「TerminateProcess(hProcess, 1);」とすればプロセスを終了させられます。

パラメタの詳細等については、市販本やInternet 等で確認して下さい。

--------------------------------------------------------------------------------------
int
ExecProcess(cmdline, hProcess)
char  *cmdline; // (IN) 実行するコマンドライン
HANDLE *hProcess; // (OUT) 起動されたプロセスのハンドル
{
  PROCESS_INFORMATION  info;
  STARTUPINFO      sinf;
  BOOL         rinf;

  memset((void *)&info, 0x00, sizeof(info));
  memset((void *)&sinf, 0x00, sizeof(sinf));

  // プロセス起動
  rinf = CreateProcess(NULL, cmdline, NULL, NULL, FALSE,
   (CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS),
   NULL, NULL, &sinf, &info);
  if (FALSE == rinf) {
    // プロセス起動失敗
    *hProcess = INVALID_HANDLE_VALUE;
    return(-1);
  }
  CloseHandle(info.dwThreadId);
  *hProcess = info.dwProcessId;
  return(0);
}
--------------------------------------------------------------------------------------

こんにちわ。
#1 muyoshid です。

以下に、プロセス起動のサンプルを挙げて起きます。

cmdline に、実行するコマンドのコマンドラインを渡すと、関数の復帰値で
プロセス起動の成功/失敗が分かります。
プロセスの起動に成功した場合、アウトパラメータで起動されたプロセスの
プロセスハンドルが帰ってきますので、プロセス終了時には
「TerminateProcess(hProcess, 1);」とすればプロセスを終了させられます。

パラメタの詳細等については、市販本やInternet 等で確認して下さい。

-----------...続きを読む

Qpsdファイルの圧縮方法

psdファイルの圧縮方法を教えてください。(基本的質問で恐縮ですが)
win98です。なお、ファイルは9MB程度ですが、圧縮したものを解凍する際、鮮明度が落ちずに元通りの画像で開けますでしょうか?

Aベストアンサー

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (デフォルトでは 1.2MB を上限として分割される。)
   (このサイズは +Lhaca で変更できる。)
 5. (4)のファイル全てを、容量を超えないようにメールに添付して送信
   する。
   (添付ファイル総数を本文に明記すること。)
 6. 受け取った側は、全ての添付ファイルを一箇所に集めて、バッチファ
   イルを実行する。
   (操作手順は、本文に明記すること。)
 7. 分割されたファイルが結合されるので、結合された圧縮ファイルを解
   凍する。
 8. 9MBのファイルが解凍されるので、作業する。


これでどうかな!?

※他の圧縮ソフトも分割機能が備わっていると思うが・・・

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (...続きを読む

Qライトモードとリードモードの両方で開くことは可能?

C言語で、あるテキストファイルに対してライトモードとリードモードの両方で開くことは可能なんでしょうか?
つまり、書き込みと読み込みを同時にできるのでしょうか?
スレッドを使えばできると聞いたんですが、本当なんでしょうか?

Aベストアンサー

ファイルを読み書きモードで開いて、読んだり書いたりすることは可能です。fopen関数で"r+"または"w+"を使います。
"r"と"w"で別々のFILE*を使う場合は、fseekを使ってファイルへのアクセス位置を指定してあげないとおかしくなります。
スレッドを使っても話は同じで、誰かがファイル位置を管理する必要があります。ただ、スレッドの場合読みと書きのどちらが先に動くか分からないので、セマフォとかファイルロックみたいな排他制御するのが普通です。

QNTFS圧縮したファイルを全部まとめて戻す方法

NTFS圧縮したファイルをプロパティからひとつひとつチェックをはずして戻すのではなく、圧縮されたファイルを全部まとめて元に戻す方法ってあるのでしょうか?

Aベストアンサー

圧縮を解除したいファイルを全て選択した状態で
→プロパティ→NTFS圧縮のチェックを外す→OK

それらのファイルがフォルダに入っているなら
フォルダのプロパティからやってもいい。
(サブフォルダにも適用するか尋ねられるからOKにする)

QC言語による「テキストファイルの読み書き(fprintf)」について

C言語による「テキストファイルの読み書き(fprintf)」について質問です
ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。
以下のように作りました。

------------------------------------------------------------

#include <stdio.h>

int main(void)
{

FILE *fp;

fp = fopen("test.csv","r+");

fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n");

fclose(fp);

return 0;
}

------------------------------------------------------------

このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。)
001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
~(略)
5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj

この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える)
AAA,BBB,CCC,DDD,EEE
002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
~(略)
5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj

またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり)

希望する動作としては
コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56
001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj
~(略)
5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj

のようになるようにしたいのですがどのようにすればよいのでしょうか。
よろしくお願いします。
(使用ソフト:Borland C++ Compiler, Cpad)
参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html

C言語による「テキストファイルの読み書き(fprintf)」について質問です
ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。
以下のように作りました。

------------------------------------------------------------

#include <stdio.h>

int main(void)
{

FILE *fp;

fp = fopen("test.csv","r+");

fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n");

fclose(fp);

return 0...続きを読む

Aベストアンサー

ファイルの書き込みの際、最後に追加することはできますが、最初に挿入することはできません。

読み込みと書き込みの2つのfp(ex. fpr,fpw)を準備し、fpwには最初に”コントロール・・・”を書き込み、その後、fprから読み込んだ内容を1行ずつ書き込んでください。


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

人気Q&Aランキング

おすすめ情報