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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

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

Ruby

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

Q&A

3回答

1056閲覧

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

photographer18

総合スコア4

ファイル

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

Ruby

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

0グッド

0クリップ

投稿2018/08/25 16:50

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

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

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

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

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

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

///////

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

ruby

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

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

ruby

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

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

投稿2018/08/27 14:53

takahashim

総合スコア1877

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2018/08/26 11:47

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2018/08/25 21:59

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問