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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

Q&A

解決済

3回答

5658閲覧

not opened for reading (IOError)

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

0グッド

0クリップ

投稿2016/11/03 11:58

編集2016/11/03 12:38

###前提・実現したいこと
タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ。
(http://www.cl.ecei.tohoku.ac.jp/nlp100/#)
###発生している問題・エラーメッセージ

11.rb:3:in `each_line': not opened for reading (IOError) from 11.rb:3:in `<main>'

エラー文的にアルゴリズムには問題ないと思ったので下記のコードに"w"を足してみたりしたのですが、変わらず...。調べても自分の理解力不足で分からんかったので質問させていただきました。よろしくお願い致します。
f = open("hightemp.txt")
###該当のソースコード

f = open("hightemp.txt","w") f.each_line do |line| puts line.gsub("¥t", " ") end f.close

###補足情報(言語/FW/ツール等のバージョンなど)
ruby2.0.0

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

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

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

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

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

ynakano

2016/11/03 12:18

課題か何かの丸投げですか?
退会済みユーザー

退会済みユーザー

2016/11/03 12:30 編集

課題ではございません。自主的に行なっています。不快に思われたなら申し訳有りません。言葉足らずでした。修正いたします。
guest

回答3

0

not opened for reading

まさしくこのエラーメッセージが肝です。メッセージの内容を把握した上で、rubyからどのようにしてhightemp.txtにアクセスしようとしているのか、もう一度確認してみてください。

投稿2016/11/03 12:12

philomagi

総合スコア267

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

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

退会済みユーザー

退会済みユーザー

2016/11/03 12:50

not opend for readingということは読み取りでは開けないということですよね。 自分はhightemp.txtを書き込みで開こうと「("w")と入れて、書き込みで開きますよ」としているのにエラーには読み取りで開けませんよと書いてある。多分、何か根本的に解釈が間違っている部分が自分にあると思うので、もう一度詳しく調べてみたいと思います。回答ありがとうございました。
philomagi

2016/11/03 12:53 編集

質問の更新内容、確認いたしました。 f = open("hightemp.txt") 上記コードで上手くいかなかったとのことですが、この時のエラーメッセージはnot opened for readingではない、別の内容だったのではないでしょうか。もう一度、第二引数を付けずに実行してみてください。 また、 f = open("hightemp.txt", "w") というコードでnot opened for readeingというエラーメッセージが発生する原因については、 https://docs.ruby-lang.org/ja/2.0.0/class/File.html#S_NEWのopenメソッドと、https://docs.ruby-lang.org/ja/2.0.0/class/IO.htmlのeach_lineメソッドの解説を確認してみてください。
退会済みユーザー

退会済みユーザー

2016/11/04 14:56 編集

返信が遅れ申し訳ありません。 第二引数をつけずに実行したらエラーメッセージは出ませんでした。ですがタブはスペースに変換されず...だとすると何が違うのでしょうか... [EXCEPTION] IOError: 自身が読み込み用にオープンされていなければ発生します。 (https://docs.ruby-lang.org/ja/2.0.0/class/IO.html) each_lineは読み込みではないとオープンできないのですね。だからこのエラーが出たんですね。ありがとうございます。
philomagi

2016/11/04 16:15 編集

f = open("hightemp.txt") では、エラーメッセージは出ず、処理結果が期待通りではなかったのですね。 タブがスペースに変換されない現象についてですが、原因はズバリ、「ファイルを書き換えていないから」です。 gsubによる変換を何に対して行っているのか、ファイルの内容に実際にアクセスしている箇所はどこか、「ファイルを書き換える」ためにはどのような対応が必要か、先に挙げたリンクの解説も参照しながら、確認してみてください。 ヒントとして、"p f.class" および "p line.class" というコードを挙げておきます。コードの適切な位置に追加して、出力内容を確認してみてください。 コードそのものを書き込んでしまえばそれが一番手っ取り早いのですが、折角自主的に取り組んでいるとのことなので、ぜひ悩んでみてください。
退会済みユーザー

退会済みユーザー

2016/11/04 16:42

"p f.class" File "p line.class" String という実行結果が出ました。 gsubによる変換はStringクラス(変数line)に対して行なっていて、ファイルにアクセスしているのはeach_lineが行なっていて、「ファイルを書き換える」ためにはこの2つが必要ということですか。 つまり、openメソッドで"hightemp.txt"をファイルオブジェクトとして生成しeach_lineメソッドで1行ずつ文字列(Stringクラス)として読み込み、それを引数としてgsubによって書き換え出力する。 ということですかね... 一応自己解決してしまったのですが、熱心なアドバイスありがとうございました。悩んでみたいと思います。
philomagi

2016/11/04 16:55

一先ずは自己解決いただけたようで何よりです。私の環境(OS X 10,10.15)では、"¥t"でも"\t"でも変わらず変換されないままなので、確かに上手くいっているのか気がかりではありますが・・・ おせっかいついでに、もう一歩踏み込んでみてください。each_lineというメソッドのレシーバは、p f.classから分かるようにFileオブジェクトであり、Fileオブジェクトを操作した結果、ファイルの内容が取得できています。換言すると、「Fileオブジェクトを操作することで、ファイルの内容にアクセスしている」のです。 一方で、lineの正体はp line.classから、単なるStringオブジェクトです。出自がファイルというだけで、文字列という以外の何物でもありません。line.gsubは、「ただの文字列」を書き換えているに過ぎず、本質的には"abc".gsub(...)というコードと何ら変わりません。さて、この時ファイルへのアクセスは発生しているのでしょうか。 さらなるヒントとして、FileクラスはIOクラスを継承しています。したがって、FileオブジェクトはIOクラスで定義されているメソッドを持っています。each_lineも、IOクラスで定義されているメソッドです。他にIOクラスで定義されているメソッドを是非調べてみてください。
退会済みユーザー

退会済みユーザー

2016/11/05 16:45

ありがとうございます。 each_lineでファイルにアクセスして持ってきた文字列をgsubで書き換えてputsで出力しているので、この時ファイルへのアクセスは発生していないと思います。 https://docs.ruby-lang.org/ja/2.0.0/class/IO.htmlに載っているメソッドはIOクラスで定義されているメソッドですよね。見たことあるメソッドが少しありましたが、ほとんど知らないのでどんな処理をするのか見てみたいと思います。
guest

0

ベストアンサー

ソースコード

f = open("hightemp.txt") f.each_line do |line| puts line.gsub("\t"," ") end

変更点

1行目の第2引数を消し、読み込みモードにした(デフォルトモード)
→each_lineは読み込み用にオープンしてないと実行できないため
3行目の"¥t"を"\t"に変更。
→¥tはタブという意味ではない。\tがタブという意味。

"¥t"と"\t"は違うということを初めて知った。
""と打つには"option + ¥"と打ちます。

投稿2016/11/04 16:08

編集2016/11/04 16:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

Ruby 2.0.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Kernelモジュール > open第二引数のオープンモード・エンコーディング が参考になると思います。

オープンモード w で open すると

"w", WRONLY|CREAT|TRUNC
ファイルを書き込みモードでオープンします。
オープン時にファイルがすでに存在していれば その内容を空にします。

と書いてあるので open した時点で hightemp.txt は空ファイルになりますので f.each_line しようがないという事になります。

投稿2016/11/03 22:47

hana-da

総合スコア1728

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

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

退会済みユーザー

退会済みユーザー

2016/11/04 15:01

参考サイトを是非読まさせていただきます。 アドバイスありがとうございます。 "w"だと空になるから"r"で読み込ませた上でeach_lineで処理をするということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問