next up previous contents
Next: 9 メソッド定義 Up: algorism_out Previous: 7 正規表現

Subsections


8 ファイルの入出力

8.1 ファイルの入力と配列操作

sermon        110yen
ika           110yen
engawa        180yen
tuna          110yen
negitoro      110yen
tako          110yen
akagai        180yen
anago         180yen
tekkamaki     110yen
hamachi       180yen
sayori        180yen
chutoro       180yen
kanburi       240yen
ikura         240yen
uni           240yen
ootoro        300yen
ebi           300yen

以下の手順でプログラムを作成していく。

  1. 上記のリストをファイルに保存する。例えばファイル名 ``sushi.dat''
  2. 保存したファイルを読み込み画面に表示するプログラムを作成する。
    ############## program ###################
    open("sushi.dat", "r") do |neta|
      while line = neta.gets
        print line
      end
    end
    ############### end ########################
    
    実行するとそのまま画面に表示される。

  3. 配列に読み込む
    ############## program ###################
    menu = []                   # 配列を用意
    open("sushi.dat", "r") do |neta|
      i = 0                     # インクリメント用変数
      while line = neta.gets
        print line
        menu[i] = line          # 配列に代入
        i += 1                  # iの値を増加させる
      end
    end
    p  menu                     # 配列を表示させている
                                # p はメソッド表示コマンド
    ############### end #######################
    
    実行結果は以下のようになる。
    sermon        110yen
    ika           110yen
    engawa        180yen
    tuna          110yen
    negitoro      110yen
    tako          110yen
    akagai        180yen
    anago         180yen
    tekkamaki     110yen
    hamachi       180yen
    sayori        180yen
    chutoro       180yen
    kanburi       240yen
    ikura         240yen
    uni           240yen
    ootoro        300yen
    ebi           300yen
    ["sermao        110yen\n", "ika           110yen\n", "engawa        
     180yen\n", " tuna          110yen\n", "negitoro      110yen\n", 
    "tako          110yen\n", "ak agai        180yen\n", "anago     
        180yen\n", "tekkamaki     110yen\n", "hama chi       180yen\n", 
    "sayori        180yen\n", "chutoro       180yen\n", "kanburi
           240yen\n", "ikura         240yen\n", "uni           
    240yen\n", "ootoro       300yen\n", "ebi           300yen\n"]
    
    
    最後に表示されたのが配列。"\n" と言うのは、改行コードでそのまま表示され
    ている。
    

  4. 上記のままでは、ネタの部分と値段が独立して取り出せない。 例えば、注文数に応じて値段を算出することができない。 したがってさらに、以下の行を付け加える。
     if /(\w+)\s+(\d+)yen/ =~ line
        menu[i] = $1
        price[i] = $2.to_i
        printf("%3d %s", i, line)
     end
    
    
     "if /(\w+)\s+(\d+)yen/ =~ line"は何を意味しているか。 
    それぞれの記号の意味は、以下の通り。
    \w    : 英数字と _ (オプションによっては日本語も含む)
    +     : 直前の表現の1回以上の繰り
    \s    : スペース
    \d    : 数字
    (  )  : グルーピング
    $1,$2 : 正規の中で、(  ) で囲われた部分が順番に変数 $1, $2, $3....に
            代入されていく。
    

  5. 上記の説明部分をプログラムに反映させると以下のようになる。
    ###################### program ############################
    menu = []                          # 配列を用意
    price = []                         ## 新たに価格用の配列用意
    open("sushi.dat", "r") do |neta|
      i = 0                            # インクリメント用変数
      while line = neta.gets
        if /(\w+)\s+(\d+)yen/ =~ line  ## if -- end までが
          menu[i] = $1                 ## 上記の説明の部分
          price[i] = $2.to_i           
          printf("%3d %s", i, line)
        end
        
    #   print line                     ## コメントアウト
    #   menu[i] = line                 # 配列に代入   ## コメントアウト
        i += 1                         # iの値を増加させる
      end
    end
    p  menu                            # 配列を表示させている
    p  price                           ## 配列を新たに表示させている
                                       # p はメソッド表示コマンド
    ######################### end #############################
    
  6. 全てのネタをひとつずつ注文した場合、値段はいくらか?
    プログラムの最後に
    
    sum = 0
    for n in 0..price.length-1
      sum = sum + price[n]
    end
    printf("ネタの合計は %d 円です。\n", sum)
    
    を付け加える。
    "price.length" は配列の大きさを与えている。
    配列は "0"からはじまり、0,1,2,3... と指定するので、要素の数は
    price.length-1 個である。
    
    ###################### program ############################
    menu = []                          # 配列を用意
    price = []                         ## 新たに価格用の配列用意
    open("sushi.dat", "r") do |neta|
      i = 0                            # インクリメント用変数
      while line = neta.gets
        if /(\w+)\s+(\d+)yen/ =~ line  ## if -- end までが
          menu[i] = $1                 ## 上記の説明の部分
          price[i] = $2.to_i           
          printf("%3d %s", i, line)
        end
        
    #   print line                     ## コメントアウト
    #   menu[i] = line                 # 配列に代入   ## コメントアウト
        i += 1                         # iの値を増加させる
      end
    end
    p  menu                            # 配列を表示させている
    p  price                           ## 配列を新たに表示させている
                                       # p はメソッド表示コマンド
    sum = 0                            ### 合計用の変数
    
    for n in 0..price.length-1
      sum = sum + price[n]
    end
    printf("ネタの合計は %d 円です。\n", sum)
    
    ######################### end #############################
    

8.2 ファイルの出力

上記価格ファイルとネタファイルを ``nedan.dat'' と ``neta.dat'' としてファ イルに保存するにはどうするか?
  1. まず、価格と値段を画面に表示させてみる。 以下を前節のプログラムの最後に加える。
    for n in 0..price.length-1
      printf("%d \n",price[n])
    end
    

  2. ファイルの保存する。以下を付け加える。

    s = open("nedan.dat", "w")     
    for n in 0..price.length-1
      s.printf("%d \n",menu[n])
    end
    s.close
    

  3. ネタファイルを保存してみよ。




平成22年12月28日