質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • Ruby

    9394questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • ファイル

    195questions

    ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ファイルへの先頭への追加書き込みで追加前に書かれていた行が一行消えてしまう(Ruby)

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 739

ご覧いただき、ありがとうございます。

今回はRubyプログラムにおけるファイルの先頭への追加書き込みにおいて、新たな文字列を追加したときに、事前にファイルに記入されていた行が追加分に上書きされ、消失してしまう状態への対処法を相談したく投稿しています。

すなわち、すでに何らかのテキストが入力されているファイルの先頭に新たに文字列を挿入するとき、事前に入力されているテキストを消さずにただ挿入だけしたいということなのですが、私のプログラムでは以下のような結果となってしまいます。

<望む実行例>
作者は太宰修です。    ←プログラムから新たに追加したい一行
太宰修は日本の最も有名な作家のひとりとして知られています。
代表作は、「人間失格」や「走れメロス」です。

<現状>*プログラムから新たに一行追加した場合
作者は太宰修です。
(太宰修は日本の最も有名な作家のひとりとして知られています。)← この一文が上書きされて失われてしまう
代表作は、「人間失格」や「走れメロス」です。

以下が今回のプログラムのコードになっています。
どうぞご助言を頂ければ幸いです。宜しくお願い申し上げます。

///////

filename = "example.txt"
io = File.open(filename, "r+")
line = io.gets
io.seek(0, IO::SEEK_SET)
io.write("作者は太宰修です。\n")

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

ファイルでそういう操作する場合は上書きの動作となります
追加したい場合は、ファイルを一旦全部読み出し、追加した状態で全部書き込み直します

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「ノートに書かれた文章があり、先頭に「作者は太宰修です。」と書いたら、元から書いてあった文字が消えた。」
という感じです。
先頭に行を追加するためには、文章全体を後ろにずらす必要があります。
文字通りずらすのは大変なので、今の文章のコピーを取って、1行目に書き込んだ後、2行目以降にコピーを貼れば良いです。

なお、追加する場所が文章末尾の時だけは、ずらしが必要なく、そのまま追加書きすれば良いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

太宰修じゃなくて太宰治です…!!!

という話はさておき、全行を読み取ってから追加したい行を書き込み、残りを改めて書き出す、という流れですね。

filename = "example.txt"
File.open(filename, "r+") do |io|  ## ブロックにすると最後に"io.close"を書く手間が省けます
  line = io.read  ## 引数なしのreadは行末まで読み込みます
  io.seek(0) ## io#seekは先頭からのオフセットを指定する場合1引数で書けます
  io.write("作者は太宰治です。\n")
  io.write(line)
end

とはいえ、Rubyの場合はよほどファイルの分量が大きくない場合、まるごと読み込んでから改めて書き直してしまった方が手っ取り早いのでおすすめしたいです。

filename = "example.txt"
lines = File.read(filename)  ## 複数行なのでlinesにしてみました
File.write(filename, "作者は太宰治です。\n" + lines)

なお、他のプログラムがexample.txtの内容を読み書きする可能性がある場合は、たいへん面倒くさいことになります(対策を書き出すと長くなるので省略します)。そこは気をつけてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Ruby

    9394questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • ファイル

    195questions

    ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。