Project1

标题: 关于readlines [打印本页]

作者: 精灵使者    时间: 2008-6-3 00:53
标题: 关于readlines
读取文本文件要用到“readlines”
有没有其详细用法?
写入字符:

  1. f = File.open("./data.txt","w")
  2. f.write( "1")
  3. f.close
复制代码

读取部分(节选)
  1. @f = File.open("./data.txt","r")
  2.     s = []
  3.     s[0] = "新游戏"
  4.     s[1] = "退出"
  5.     case @f.readlines[0]
  6.     when "1"
  7.     s[2] = "第二关"
  8.     when "2"
  9.     s[2] = "第二关"   
  10.     s[3] = "第三关"
  11.     when "3"
  12.     s[2] = "第二关"  
  13.     s[3] = "第三关"  
  14.     s[4[= "第四关"     
  15.     end
复制代码

可以不可以储存多个变量并读取多个变量呢。
请高手指点。
另外帮助里这么写的:
readlines([rs])
读入所有数据后,以行为单位将其转化为数组,并返回该数组。若 IO 已到达 EOF 则返回空数组 []。

使用 rs 所指字符串进行行的切分,rs 的默认值为 "\n"。

若将 rs 指定为 nil,则意味着忽略行的切分。若指定为空字符串 "" 的话,将把连续的换行当作行的切分符(段落模式)。

如何写入和读取多个变量操作呢? [LINE]1,#dddddd[/LINE]版务信息:版主帮忙结贴~
作者: 3535    时间: 2008-6-3 02:33
  1. @f = File.open("./data.txt","r")
  2.     s = []
  3.     s[0] = "新游戏"
  4.     s[1] = "退出"
  5.     n = @f.readlines
  6.     case n[0]
  7.     when "1\n"
  8.     s[2] = "第二关"
  9.     when "2\n"
  10.     s[2] = "第二关"   
  11.     s[3] = "第三关"
  12.     when "3\n"
  13.     s[2] = "第二关"  
  14.     s[3] = "第三关"  
  15.     s[4]= "第四关"     
  16.   end
复制代码

作者: 精灵使者    时间: 2008-6-3 18:00
这样么?
我似乎没有说明白。
如果同时动用2个变量,例如可以使用
if n.readlines[0] == 1 or n.readlines [1] == 2
...
这样的话,怎么写呢?
例如,我想存储2个变量,如何写那个
f = File.open("./data.txt","w")
f.write( "...")
f.close
可以得到这个效果:
@f = File.open("./data.txt","r")
a = @f.readlines[0]
b = @f.readlines[1]
p a,b #=>1,2
@f.close
里面的省略号里面要填什么?
作者: 禾西    时间: 2008-6-3 18:08
readlines 讀取到的只能是 String,不可能是num

使用方法跟split基本一樣。

作者: 精灵使者    时间: 2008-6-3 18:16
如何能将其分割呢?
是不是需要用
f.write( "1\n2")
来进行分割呢?
或者把数据转换以后再进行存储和读取工作?
另外,中间能直接存储变量么?
作者: 禾西    时间: 2008-6-3 18:23
f = file.open('禾西的brain.text','r')
p f.readlines

["簡單地說吧\n",
"當我們的text文檔用readlines來讀的話就會是這個樣子的\n",
"每一行都會成爲數組的一個元素\n",
"當我們用 ×××.puts String 的時候\n",
"Ruby 會自動加上"\n"這個東東\n"]

f.close

然後當我們打開text文檔的時候就看見我們的說話像這個樣子:
而readlines默認情况下會根據"\n"這個東西來分段,也就是一行爲一個元素。
你不必要一定使用"\n"當然也可以使用"@"、","甚麽的
只要readlines([@])或者readlines([,])就可以了

實際上就是你的理解一樣,不過實際上.write("   ")這個東西可以隨便寫。
readlines的時候注意一致就可以

PS:以上沒有亂碼
[LINE]1,#dddddd[/LINE]系统信息:本贴由本区版主认可为正确答案,66RPG感谢您的热情解答~
作者: 精灵使者    时间: 2008-6-3 18:31
也就是说,可以使用
f.write( "1\n2")
就能达到
a = @f.readlines[0]
b = @f.readlines[1] #a,b分别被赋予了两个不同的字符串
这种情况吧。
里面的存储的东西能不能达到

  1. 1
  2. 2
复制代码

这个目的呢。
如果用其它的作为分界符的话,要读取里面的某一个元素应该怎么写。
另外能不能使用
a = $game_variables[1]to_s
b = $game_variables[2]to_s
f.write( a,"/n",b)
的模式来存储a和b的内容?

作者: 禾西    时间: 2008-6-3 18:33
String 和 Int 的轉換可以用 ×××.to_i
還有,.readlines是很耗費精力的。要是重複調用當中的數據,記得把.readlines的返回值儲存起來
作者: 精灵使者    时间: 2008-6-3 18:36
如果用其它的作为分界符的话,要读取里面的某一个元素应该怎么写。
另外能不能使用
a = $game_variables[1].to_s
b = $game_variables[2].to_s
f.write( a,"/n",b)
的模式来存储a和b的内容?
我首先读取和存储的东西都会另存为的。
作者: 禾西    时间: 2008-6-3 18:50
不行耶。
.write( )只能帶一個參數,你的有3個了。
可以使用以下方法(禾西常用)
f.puts a
f.puts b

試試以下代碼,你應該比較容易明白

  1. f = File.new("./data.txt","w")
  2. f.write("我×你×蘿蔔")
  3. f.puts "好high"
  4. f.close

  5. f = File.open("./data.txt","r")
  6. array = f.readlines("×")
  7. f.close
  8. p array
复制代码


另外儲存變量何不學習 Save ?
那個M***.dump()的函數(忘記名字了==a)
作者: 精灵使者    时间: 2008-6-3 18:59
你的那个脚本有类型错误。
array不能转换为字符串。
作者: 禾西    时间: 2008-6-3 19:04
手殘手殘...已經更正
作者: 精灵使者    时间: 2008-6-3 19:12
似乎写成了
["我x","你x","蘿蔔好high/n"]
明显不符合要求啊。

作者: 禾西    时间: 2008-6-3 20:02
.readlines 是不會幫你 chop 的。
要自己調用這個
×××.map!{|str|str.chop! if str=~/$[\n]/}
如果你想要達到你的要求。readlines 不是個好方法。最好還是用 split
作者: 精灵使者    时间: 2008-6-3 22:25
恩恩……
太麻烦了……
我还是用那个来保存单个数据好了。
谢谢你了。
P.S.这个似乎脚本好复杂- -
作者: 禾西    时间: 2008-6-3 22:27
其實我一直都在建議你用 .split(/ /)來讀...不要用.readlines
作者: 精灵使者    时间: 2008-6-3 22:28
以下引用禾西于2008-6-3 14:27:02的发言:

其實我一直都在建議你用 .split(/ /)來讀...不要用.readlines

split这个f1我似乎查不到。
readlines上次我通过k那个游戏才稍微明白些……
作者: 禾西    时间: 2008-6-3 22:31
果然置頂帖的存在意義是被人漠視啊T T
http://rpg.blue/viewthread.php?tid=80788
http://rpg.blue/viewthread.php?tid=86205
作者: 精灵使者    时间: 2008-6-3 22:36
我以前只知道有这个模块而且是用来判断的,但是我根本不知道是什么意思……
另外,写的时候如何来写入这个数组呢?
还是用puts?
作者: 禾西    时间: 2008-6-3 22:43
如果是大數據就用這個
    file = File.open(filename, "wb")
    Marshal.dump(variable, file)
    file = File.open(filename, "rb")
    variable        = Marshal.load(file)
作者: 精灵使者    时间: 2008-6-3 22:47
以下引用禾西于2008-6-3 14:43:31的发言:

如果是大數據就用這個
   file = File.open(filename, "wb")
   Marshal.dump(variable, file)
   file = File.open(filename, "rb")
   variable        = Marshal.load(file)

[本贴由作者于 2008-6-3 14:44:17 最后编辑]

这个函数我很熟悉。二回目里面也写了,而且我还修改Scene_save和Scene_load让其储存更多的变量……
这个也能在其它地方使用?原本我的计划只用到了存档上。回去研究一下什么是真正的二回目去……
作者: hitlerson    时间: 2008-6-3 22:47
split这个函数好象什么语言都通用
作者: 禾西    时间: 2008-6-3 22:51

以下引用精灵使者于2008-6-3 14:47:13的发言:

當然可以....

以下引用hitlerson于2008-6-3 14:47:13的发言:

split这个函数好象什么语言都通用

估計是世界同語,就像ba、 ma、bekbek 一樣{/hx}
作者: 精灵使者    时间: 2008-6-3 22:56
能用Marshal存储多个变量的话那真是太好了……
话说回来,可以不可以在多个地方来储存marshal呢?
例如两次在同一个文件储存同一个变量,是覆盖还是继续呢?
是不是每次file.close再file.open以后都会从头覆盖这个数据?
就像覆盖存档一样?
作者: 禾西    时间: 2008-6-3 22:57
好像是覆盖,具體要做試驗才知道。
作者: 精灵使者    时间: 2008-6-3 23:01
我记得也是覆盖,否则那些进度数据会越来越大了……
如果是那样的话,那么必须就得把所有需要存的变量分开,而且每个变量都要重新存一次……
我修改过存档部分,大概知道他那里的存档规则……所有的数据都是按顺序存的。
读取可以不读取完毕,但是存储一定要存储完毕,否则就会出现EOF




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1