既存のテキストファイルを保存したい – プログラミング – Home

既存のテキストファイルを保存したい
 
通知
すべてクリア

[解決済] 既存のテキストファイルを保存したい

固定ページ 1 / 2

soto
 soto
(@soto)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

先ほどは失礼いたしました。≫woodさん
新規に投稿させていただきます。

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

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

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

そこで・・・

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

お願いします。


引用未解決
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

そのファイルを開いているプログラムがもし、あなたが改変できるものであるなら、あな
たが今作っているプログラムからそのプログラムに対しメッセージを投げて、ファイルを
closeさせる、という風にするのが現実的だと思います。


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

それにしても、本当に他のプログラムがopenしているファイルを初期化しちゃっていいん
でしょうか。そのプログラムにとってファイルが途中で書き換えられることでエラーの原
因になったりしないか心配です。

そのファイルに対してどの程度のセキュリティが必要なのかが解らないので何ともいえま
せんが、私だったら他のプログラムに対し「強制close指示」と共に「読み書き制限及び
制限解除通知」も実装するでしょう。また、「強制close指示」に対して「ちょっと待っ
て/もういいよ」という返答ができるようにするとか、一旦テンポラリファイルに必要な
内容を出力しておいて、強制closeが完了したのを確認した後にファイル名を変更するな
どして読み書きを制限している時間をなるべく短くするような配慮も必要だと思います。


返信引用
soto
 soto
(@soto)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

そうですか・・・

例えば既存のテキストファイルを2重に開きます。
1つのファイルの内容を全部デリートして保存します。
もう一方は開いては居るんですが開きなおしたらすべて消えている状態
ということは出来るんですけどね・・・
手動ですけどこれをプログラムで実行したいだけなのです。

INIファイルを操作する関数などでは全消しっていうのがあるんですけどねぇ・・・
テキストファイルで全消しはないのでしょうか?


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

テンポラリファイルにコピーしてから処理してはだめなんですか。


返信引用
soto
 soto
(@soto)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

テンポラリファイルっていうのは何ですか?
具体的にどうやるのですか?


返信引用
lr
 lr
(@lr)
ゲスト
結合: 22年前
投稿: 4
 

聞く前に検索しましょうよ
googleで検索すればサンプルがでてきますよ。


返信引用
soto
 soto
(@soto)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

大変申し訳ありません。
本来投稿すべきものでないものを投稿してしまいました。
失礼しました。

テンポラリファイルとは一時ファイルですよね。
私の行っている処理では一時ファイルとして使っているファイルを
ユーザが開いてみるという可能性もあるという形式を取っています。
ですので本来はtibさんの言うとおり開いている場合は何らかのメッセージを表示し
閉じさせる必要があるのかもしれませんね・・・

ただそのメッセージではなく単純に内容だけを消去する(しかも起動時のみ)
ということをしたかったので今回の質問をさせていただきました。


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

そのファイルを見る方のアプリケーションは、
ファイルを表示する際にファイルを開いたままなのでしょうか?

普通は、fopenで開いて内容を読み込んだら、fcloseでファイルを
閉じてしまっても問題ないと思いますが。


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

一時ファイルをユーザが開く、という行為は、通常起こることなのでしょうか。
イレギュラーなケースなのでしょうか。

一時ファイルをユーザが手軽に開けるというのも、いかがなものでしょうか。
一般に、アプリがある処理をする上で一時的に使用するファイルなわけですから、
アプリは、ユーザに知られることなくこっそり生成するなり処理するなり
するものではないかと。
あくまで、一般論で。


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

soto さん 結構皆さんいろんなご意見いただけたでしょ
そこでわたしも一言
処理するたびに新しいファイル名で作るのではダメでしょうか
人為的ファイル競合を防ぎたいのならこの方法がお勧めですけど
処理のログを取るようなものなら、なおさらそのように思いますけど

自分の出力したデータは、逆を言えばほかの人に破棄されてもかまわないもの
なのでしょうか
続きの処理とかで出力データが処理される必要はないものですか?

ただのデバック用ならコマンドライン引数にファイル名与えるのも
ひとつの手ですけど


返信引用
soto
 soto
(@soto)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

多数のお返事ありがとうございます。

処理の流れ/条件を書きますと
1.一時DATファイルに計算した結果を出力する。(意味の無い数字の羅列)
2.一時DATファイルを加工したものを出力結果とする。(理解可能な表示形式)
3.出力結果はユーザーが任意のタイミングでオープンする。
4.結果のログは残す必要が無く常に最新のファイルが特定の場所に1つ在ればよい
5.当然DATファイルも使いまわす。
6.例え誰かが開いていても処理を行えば最新の状態に更新される。

となっております。

//////////////
少々強引かもしれませんが以下の手法でできました。
開けないならファイル後と消す。ということで・・・

CString filename = c:\\abc.txt;
remove(filename );

FILE *out_file = fopen(filename,w);
fclose(out_file);


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 ファイルサイズを変更(0に)するなら、_filenoと_chsizeを使用するとか。

_chsize(_fileno(out_file),0);


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

だれかが開いているファイルを remove(filename );
しようとすると命令の実行はされるけどエラーで帰ってくるのでは
ないでしょうか
成功したかに見えて実は成功しないケースになると思いますけど

VC1.0 DOSアプリの時はダメだったような気がします


返信引用
soto
 soto
(@soto)
ゲスト
結合: 22年前
投稿: 11
Topic starter  

その通りでした。

気づいたことは・・・
テキストファイルは開いていても消去できる(全部メモリに読み込んでしまうため?)
消去しようと思っているのはCSVファイルで開いていると消去できず
開いている時のファイルサイズの変更もテキストはできるがCSVではエラー

そのファイルにアクセスしているアプリケーションによって違うのかもしれませんね。
#テキストファイルはメモ帳で、CSVファイルはエクセルで開いた状態で実験しました。

困った・・・
やはり通知して閉じて頂くしかないのかもしれませんね・・・
しかももしやと思って試したこの後やる追記処理なんですが
こちらもエクセルによるアクセスがあるとエラーになってしまうことが分かりました。
これでさらに開いているファイルに対して処理を行なうという
考え自体がきつくなってきました。

ちょっと考えて見ます。
ご指摘ありがとうございました。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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