• ベストアンサー

ファイルの途中に文字列を挿入

こんにちは。プログラミング初心者で、初めて質問させていただきます。勉強中に思ったのですが、 ファイルの書き込みについてなのですが、あるファイルに既にデータがあり、その先頭部分(あるいは途中)にある文字列を追加挿入しなければならなくなった場合どういった処理をすることになるのでしょうが? fseekなどで場所を指定して書き込んでしまうと、そこの文字列が上書きされてしまうと思うのですが。

  • bahoo
  • お礼率75% (136/180)

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

・簡単なやり方 新しいファイルを作って、挿入位置より前のデータを元ファイルからコピー、挿入データを追記、挿入位置より後のデータを元ファイルからコピーする。元ファイルを消して新しいファイルをリネームすれば完了。 ・上記では空きディスク容量が足りないとき 挿入位置より後のデータを挿入データ分だけ後ろに移動して空いた位置に挿入データを書き込む。データの移動は上書きしないように後ろから順にコピーするなど手順は面倒だが出来ないことではない。 なお性能は考慮してませんので。後者の方法をとらなければいけないほど大きなファイルなら途中挿入が必要にならないデータ構造の検討から始めるべきでしょう。

bahoo
質問者

お礼

なるほど。後者は特にギミックなやり方ですね。 やはり、データ構造にポイントがあるようなので、その辺の考え方も勉強していこうと思います。 ありがとうございました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

可能であるなら、ファイルへの書き込みはデータが完成してから一気に書いた方が無難です。 そうしないと、中途半端にファイルに書き込んでから、途中でエラーや例外が発生した場合に、いろいろと面倒が起こります。 データが完成してからなら、I/Oエラー以外で中途半端なファイルができる可能性はありません。 もちろん、今回のように途中にデータを挿入したり、一部分を削除することも、メモリ上で行えば簡単です。

bahoo
質問者

お礼

ありがとうございます。 そうですよね。そういえばソフトを使ってファイル開くとその文だけメモリも食っているので、いったん全部も見込んで処理しているのですよね。

回答No.1

全部はじめから読み込んで、必要なところにデータを追加して、別のファイル名で書き戻します。後は、必要なら元のファイル名を変更するか削除し、変更したファイル名を元のものに変更します。 全部読み込むことがストレスとなるようなファイルの場合は、ランダムファイル等のデータ構造を考える必要があるでしょう。

bahoo
質問者

お礼

なるほど、やっぱりすべて新しいものに移すのですね。 結構ストレスのかかるものなので、何か技があるのかと思いましたが、その技はデータ構造の検討にあるようですね。 これからデータ構造を考えるような勉強もしていこうと思います。 ありがとうございました。

関連するQ&A

  • バッチファイルでファイル名に文字列を挿入したい。

    フォルダにあるファイル全てに対して、ファイル名の先頭に文字列を挿入するバッチファイルを作っています。 対象のファイルは、主にエクセル、ワード、パワーポイント、PDFですが、ファイルの種類に関係なく、全てのファイルに対して、ファイル名の先頭に文字列を挿入したいです。 @echo off for %%i in (*) do ren "%%i" "【文字列】%%i" pause として文字列の挿入自体はできました。 しかし、このファイルを2回実行すると、ファイル名の先頭に【文字列】【文字列】と重複して挿入されてしまうので、すでに挿入済みのファイルに対しては実行しないようにしたいのですが、うまくいきません。 また、サブフォルダ内にあるファイルに対しても同様の処理を適用したいです。 どのように記述すればよいでしょうか。 リネームソフトを使えればよいのですが、フリーソフト等はインストールできない環境ですので、できればバッチファイルを記述して対応したいのです。 OSはウインドウズ7です。

  • EXELで文字列の先頭に文字を挿入したい(置換)

    EXEL2003です。 セルに文字列が並んでいます。 それの先頭にある文字を挿入するにはどうしたらよいのでしょうか? 「置換」で先頭とか、末尾を指定する方法がありますか? よろしくお願いします。

  • 文字列の部分読み込み

    C言語によるプログラムを勉強中なのですが、分からないことがあるので質問させてください。 「fgets」を用いてファイルから一行分の文字列を読み込んだのですが、この文字列の○文字目から×文字目を読み込む関数などはあるのでしょうか? もし無ければ、どのようにしたら読み込めるのでしょうか? 読み込んだ文字列は □□□□1234□□□5678□□abcd のようなもので、□は半角のスペースです。 区切り文字などが無く、先頭の半角スペース部分に文字が入る場合もあるので、○文字目から×文字目のように指定したいと思っています。 初心者で申し訳ありませんが、よろしくお願いいたします。

  • VB2008 文字列に等間隔にスペース挿入

    VB2008を使い出して結構経ちますがまだまだ勉強中の者です。質問させていただきます。 指定文字列に等間隔に文字を挿入したのですが、方法がぱっと思いつきません。 ご指導宜しくお願い致します。 指定文字列 ”001001000” を ”0_0_1_0_0_1_0_0_0” としたい。 ・文字数と内容はその都度違う。 ・文字と文字の間に指定文字を挿入したい。挿入方法は上記の方法で固定です。 これはRS232C通信でコマンドを送信する際に上記処理が必要となります。 以上、宜しくお願い致します。

  • VBSで指定行に挿入

    VBScriptで指定行に文字列を挿入したいと思っていますが可能でしょうか? 例:)2行目に挿入 前    後 1    1 2    挿入列 3    2      3 先頭から呼んでいき WriteLineを… と思ったのですが、最後尾に追加でした^_^; で、新規ファイルに順に呼んで(前)を削除、(後)をリネーム。と考えたのですが、スマートではありません。 なにかよいメソッドはあるのでしょうか?

  • Access 指定した文字列を取得し、文字を挿入する

    関数で指定した文字の指定した位置に指定した文字を挿入したのですが どのようにすれば良いでしょうか? 更新クエリで更新したいです。 例:○○営業所Telxxxx-xxxx-xxxx ↓ ○○営業所 Telxxxx-xxxx-xxxx Telの先頭にスペースを追加

  • 特定の文字列を挿入

    テーブルのセルに特定の文字列を挿入する方法は御座いませんか? 例えば、 HTMLファイル <html> <head> </head> <body> <table> <tr><td> (1) </td><td> (2) </td></tr> <tr><td> (3) </td><td> (4) </td></tr> </table> </body> </html> とあった場合 JavaScriptファルには (1)に挿入する内容 (2)に挿入する内容 (3)に挿入する内容 (4)に挿入する内容 を書いてHTMLファイルに書き出しをしたいのです。 document.write('');を使って書き出す方法は知っていますが、指定した場所に貼り付けたい場合複数ファイルが必要になりますよね? それでは不便なので、JavaScriptファルは外部化で1つのファイルにし、指定箇所に文字列を挿入する方法を教えてください。 printを使えばいいんでしょうか?

  • テキストファイルの先頭への文字列挿入について

    更新履歴を自動で作成するようなものを作りたく思っています。 それで既に何かが入力されているテキストファイルに 先頭への挿入という形で書き込みを行いたいのですが なにか良い方法はありませんか?

    • ベストアンサー
    • PHP
  • JPG、GIF画像に指定した文字を自動挿入する方法

    はじめて投稿します。よろしくお願い致します。 JPGもしくはGIFファイルに指定文字を自動で挿入できるソフトを探しております。 手動での文字挿入はほとんどの画像処理ソフトで出来ますが、たとえば引数などを使って自動で処理ができるソフトを探しております。 具体的には1000枚程度の同サイズの画像の指定した場所に指定した文字列や数字を挿入したいと思っております。この時に数字だけを変更したいのです。 このような処理を行えるソフト(可能ならばフリーソフト) もしくは簡単なプログラミングやバッチ処理を用いる方法はありませんでしょうか? なにか情報がありましたらよろしくお願いします。

  • 段落の先頭に文字列を挿入する秀丸マクロはありませんか?

    段落の先頭に文字列を挿入する秀丸マクロはありませんか? 文書の作成時に、各段落の先頭に特定文字列を挿入するマクロを探しています。 原稿は英文と日本語文の2通りあり、それぞれについて作業できるようにしたいのですが、どなたかご存知の方はおられますか? ネット上で検索したのですが、なかなか使えるものが見つかりません。 自分でマクロを作成したいところですが、私に難しく、まだ勉強中です。 よろしくお願い致します!

専門家に質問してみよう