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

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

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

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

Q&A

解決済

1回答

4080閲覧

バイナリモードとテキストモード

reotantan

総合スコア295

Ruby

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

0グッド

0クリップ

投稿2015/08/20 12:36

io=open("a.txt","w+")
io.print("hello,world ramune.\n")
io.rewind
line=io.gets

io=open("a.txt","w")
io.binmode
io.write"hello,world\n"
本には上のコードには最初の変換には"\r\n"が含まれるとありますが、
コマンドプロンプトで確認してもhello,world ramune.と出てきます。

"\r\n"というのはファイルの中には存在しているという事でしょうか?
どのような変換の流れが存在するのでしょうか?
詳しい方教えてください

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

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

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

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

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

guest

回答1

0

ベストアンサー

Windows環境の話ですよね。
Rubyが生まれたUnix環境では改行は"\n"という1文字です。ところが一方、Windows環境では改行は"\r\n"という2文字です。
Unix/Linux環境と、Windows環境でプログラムを書き換えないといけないのであれば不便なので、
「Windows環境の時は、ファイルに"\n"を書き込むときに内部で自動的に"\r\n"に書き換える。ファイルから読むときに"\r\n"の連続は内部で自動的に"\n"に置き換える。」という機能が生まれました。
これがテキストモードです。また、テキストモードには「"\x1A"はファイルの終わりと見なす。」という機能もあります。

ただ、そうすると、内容が文字で無いファイル(画像ファイルとか)の場合に、データをそのまま自由に書けない読めない(自動的に変換されたり、ファイルの終わりとみなされたり)という問題が発生します。そこで、データを変換せずにそのまま読み書きするモードをバイナリモードとしました。

以上のことは、Rubyの発明でもWindowsが出来てからの話でも無く、1970年代の8bitマイクロコンピューター時代に、Unix上で使われていたC言語を当時の8bitOS(CP/M)に移植した際の発明です。

コマンドプロンプトで確認してもhello,world ramune.と出てきます。
"\r\n"というのはファイルの中には存在しているという事でしょうか?

Ruby

1open("file1.txt","w") do |io| #テキストモードなので、\r\n に変換されて書かれる 2 io.print "a\nb\nc\n" 3end 4open("file2.txt","wb") do |io| #バイナリモードなので、\n そのまま書かれる 5 io.print "a\nb\nc\n" 6end

で、ファイルを作ってみてそれぞれを、Windows標準のメモ帳で開いてみると違いが分かると思います。
メモ帳だと、"\r\n"でないと改行とみなしません。

投稿2015/08/20 13:50

otn

総合スコア84505

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

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

reotantan

2015/08/20 14:07

詳しい説明ありがとうございます。頭の中がすっきりしました、 確かに画像ファイルなど勝手に変換されたり困りますね;; 本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問