ファイル操作 – プログラミング – Home

通知
すべてクリア

[解決済] ファイル操作


バベル
 バベル
(@バベル)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

こんにちは。
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
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

wでfopenすると、ファイルの内容は破棄されてしまいますよ。

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


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

out_file = fopen(c:\\abc.txt,w+);
にして下さい。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> out_file = fopen(c:\\abc.txt,w+);

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>ファイルを 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+”と言うことになると思います


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

>w+では現在の内容を破棄してしまいますよ。

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

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


返信引用
開いているファイルに書き込みしたい
 開いているファイルに書き込みしたい
(@開いているファイルに書き込みしたい)
ゲスト
結合: 22年前
投稿: 1
 

便乗質問です。

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

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

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

そこで・・・

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

お願いします。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

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


返信引用
バベル
 バベル
(@バベル)
ゲスト
結合: 22年前
投稿: 2
Topic starter  

みなさんありがとうございました。
お返事遅れてすみませんでした。
aでうまくいきました。
僕が見ている入門書にはr、wしかのっていなかったので・・・
みなさんのおかげでいろいろな使い方があることがわかりました。
まだまだ勉強不足で入門書から卒業できないのですががんばりたいと思います。
ありがとうございました。


返信引用
RAPT
 RAPT
(@RAPT)
ゲスト
結合: 23年前
投稿: 310
 

こんばんは、RAPTです。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました