ファイル操作

[戻る]
バベル 2002/12/11(水) 17:42:02
こんにちは。
VC++でC言語を勉強をしています。
ファイルの入力の所なのですが、

out_file = fopen("c:\\abc.txt","w");
fprintf(out_file,"%s","文字列");

とすると上書きされてしまいます。
テキストファイルにどんどん書き込みされていくようにしたいのです。

がんばって調べてみた結果
fseek
という関数を発見したので 
fseek (out_file,0,SEEK_END);
としてみたのですが状況はまったくかわらず上書きされてしまいます。
なにかいい方法を教えてください。
環境はwindowsNT4.0 VC++6.0です。
お願いします。

sugar 2002/12/11(水) 17:45:36
"w"でfopenすると、ファイルの内容は破棄されてしまいますよ。

http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vclib/html/_crt_fopen.2c_._wfopen.asp

アイススケーター 2002/12/11(水) 19:12:35
out_file = fopen("c:\\abc.txt","w+");
にして下さい。

YuO [E-Mail] 2002/12/11(水) 23:13:08
> out_file = fopen("c:\\abc.txt","w+");

w+では現在の内容を破棄してしまいますよ。
追記するのですから,aですな。

wood 2002/12/12(木) 07:35:45
>ファイルを "a" または "a+" のアクセス モードで開くと、書き込み操作はすべてファ
>イルの終端から行われます。ファイル ポインタは fseek 関数または rewind 関数で移
>動できますが、書き込み操作の前に必ずファイルの終端に戻されます。したがって、既
>存のデータは上書きされません。"r+"、"w+"、"a+" のいずれかのアクセス種別を指定
>すると、読み出しと書き込みの両方ができます (ファイルは "更新" モードで開いたこ
>とになります)。ただし、読み出しと書き込みを切り替えるときは、その前に 
>fsetpos、fseek、rewind のいずれかの関数を実行する必要があります。必要に応じ
>て、fsetpos 関数または fseek 関数には現在位置を指定できます。

で今回は、”a”をお勧めします

書き込んでいる最中にファイルポインタを戻って読み直しまたは、部分的に書き直し
を必要とすすのなら

たとえば 10件前の”ああああ”を”いいいい”に書き換える必要があるのなら
fsetpos、fseekを使う必要が出てくるので
モードを”+”の付いている”r+”をお勧めします

”r+”の場合ファイルオープン時は先頭になっているので
書き込み位置を指定しなければなりません(fseek (out_file,0,SEEK_END);など)

”a+”の場合は再読み出しできるけど書き込みは何が何でも最後に追記されます

”w”・”w+”の場合ファイルオープン時に必ず破棄されてしまうので今回向きでは
ありません


よって今回は”a”または”r+”と言うことになると思います

アイススケーター 2002/12/12(木) 07:48:18
>w+では現在の内容を破棄してしまいますよ。

すみません、今開発中のハンディーターミナルの追記がw+だったので思わず書いてしまいまし
た。

ご迷惑をおかけしました。

開いているファイルに書き込みしたい 2002/12/12(木) 09:16:53
便乗質問です。

今作っているプログラムでは処理内容をテキストファイルに
書き込む処理を行っているのですが
前回の書き込み内容を一旦すべて削除してから処理を開始するために

out_file = fopen("c:\\abc.txt","w");
fclose(out_file);

を書き込むことによって起動時に初期化しています。
ですがこのファイルを誰かが開いていた場合には当然破棄できず
閉じてからプログラムを起動しなくてはならないというのが現状です。

そこで・・・

ファイルを誰かが開いていた状態でも初期化ができるような方法は無いでしょうか?
ここでいう初期化はテキストファイル内の文字がすべて消えた状態で
保存されるということです。(今開いている分は閉じたら失われる)

お願いします。

wood 2002/12/12(木) 10:49:15
>開いているファイルに書き込みしたい さん 
ファイルの排他に関する質問は別にスレッドあげたほうがいいですよ
場合によって論議が長引くことありますから

バベル 2002/12/12(木) 11:26:55
[[解決]]
みなさんありがとうございました。
お返事遅れてすみませんでした。
"a"でうまくいきました。
僕が見ている入門書には"r"、"w"しかのっていなかったので・・・
みなさんのおかげでいろいろな使い方があることがわかりました。
まだまだ勉強不足で入門書から卒業できないのですががんばりたいと思います。
ありがとうございました。

RAPT 2002/12/12(木) 17:11:43
こんばんは、RAPTです。

VC++使っているのなら、MSDN見るといいですよ。
w r a w+ r+ とか、何が指定できるのか、どういう意味か、書いてあるので。

Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0

古いスレッドには追加発言できません。