ファイルのデータを切り捨てるには?

[戻る]
YUUKO 2001/06/28(木) 03:11:14
はじめまして。
早速ですが質問があります。
例えば
「こんにちわ。元気ですか?」
と言うファイルがあったとして、
「元気ですか?」を切り捨てて
「こんにちわ。」
だけにするにはどうしたらいいのでしょうか?

VC++ 6.0 SDKという環境で作業してます。
よろしくお願いします。

ku 2001/06/28(木) 09:36:50
何か課題のようなにおいを感じますが、
その場合は課題を出された方に質問するのがすじですし、
またその方には答える義務、あなたには質問する権利があるはずです。
課題とは限らないでしょうが。

さて、答えの方ですが僕自身がこの質問の曖昧な部分の仕様を決めて
全てを答えてもそれほどでもないのですが
YUUKOさんが分かっている部分と分かってない部分を明示して
分からない部分を質問するべきだと思います。
こんにちわ。元気ですか(ちなみに日本語として正しいのは「こんにちは」です)
というのはファイルの中身だと思いますが
このファイルを読み込んで、
コンソール画面かウィンドウ画面に表示することはできますか?
つまるところ、文面からどこまでご理解されているのか判断できないということです。

ファイルのサイズを小さくする(切りつめる)方法を知りたいということでしたら
書き込みできる状態でファイルをオープンして
SetFilePointerとSetEndOfFileを使えばできると思います。

YUUKO 2001/06/29(金) 00:01:54
課題とか全くそういった類のものではないんです。

一応、ファイルの読み込み、書き込み、削除、検索等は
出来ますし、ウィンドウにその文章を表示できます。

それで、質問が少し間違えてました。
すいません。

「こんにちは。元気ですか?私は元気です。」
で「元気ですか?」を捨てて
「こんにちは。私は元気です。」と言う風にしたいのでした。

教えていただいた方法でやるとするなら
「こんにちは。」の後にSetFilePointerでファイルポインターを
移動させ、SetEndOfFileでEOFをセットし、
その後、「私は元気です。」を書き込むという感じになるのでしょうか?

これでいいのでしょうか?
もっといい方法はありますか?

ku 2001/06/29(金) 09:51:04
質問が丸投げふうでしたので失礼な書き方をしてしまいました
大変申し訳ございませんでした。

> これでいいのでしょうか?
確認してはいませんが、これはこれで正常な処理になると思います。

「こんにちは。」の後にSetFilePointerでファイルポインターを
移動させ、「私は元気です。」を書き込み(上書き状態)
SetEndOfFileでファイルの終端位置を設定する。としてもできます。

> もっといい方法はありますか?
これはファイルの途中を切り捨てて、それ以降を詰めるようなAPIが存在するのか?
というご質問だと思いますが、そういったものを見たことはないので
恐らく「無い」が答えだと思います。
どちらが良いという話ではありませんが、別の方法ということで、
アルゴリズム的にということでしたら、ディスクに元ファイル分の空き領域があるなら
1.元ファイルを読み込み(a.txt)
2.切り捨てる部分以外を書き込んでいく(b.txt)
3.両ファイルを閉じる
4.DeleteFileでa.txtを削除する
5.b.txtをMoveFileかMoveFileExでa.txtにリネームする
なんて方法もあります。

ディスクはクラスタ単位(アロケーションサイズ)で管理していて
CreateFileのような通常のWin32APIではなく、
もっと低レベルでシステム寄りのアプリケーション(僕には作れません)なら、
クラスタ単位でリンクをスワップしたり、リンクを切ったりできるのでしょうが、
これは1バイト単位などというものでは無いので
何らかの日本語的な意味がある文字列を切りつめたりするのには使用できません。
環境によりクラスタサイズは可変でもありますし。

YUUKO 2001/06/29(金) 18:17:13
[[解決]]
>これはファイルの途中を切り捨てて、それ以降を詰めるようなAPIが存在するのか?
>恐らく「無い」が答えだと思います。
ありませんか〜。
会ったら便利でいいなと思っていたんですが・・。

SetEndOfFileを使うとファイル内の以前のエンド オブ ファイルの位置と
新しい位置との間の内容は、 未定義になるということで
少し不安なのでkuさん提案の
ファイルを作成し、リネームする方法にしたいと思います。
kuさん、ありがとうございました。

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