2013-02-14 81 views
-3

到目前为止,我一直在使用这些方法读取来自STDIN的输入,同时在codechef挑战中竞争;Ruby中的缓冲IO

如果我要读两个int值, 我会用

a, b = gets.chomp.split.map(:&to_i) 

同样的事情浮法,除了.MAP(:& to_f) 如果我要读整数数组然后,

a = gets.chomp.split.map(:&to_i) 

,然后通过快速IO方法[指数]

在java中/ C#,我可以使用读出(BUF,0,大小)地址然后将这些字节转换为int或char类型。我通常会在github上使用这些模板(点)com/shankar-ray

但现在我使用红宝石,完全是一个新手,过去几天我一直在阅读大量的文档和pdf,但我需要一个更快的方式来读取输入,可能整数,字符,双打等,以及如果我能知道如何实现一种方法,我可以做其余的,

我想ruby做所有事情使用数组或哈希,据我所知,但当我选择使用多维数组时,出现问题,现在在Java中我可以使用[] []和赋值,但与红宝石时,我尝试做这样的事情;

a = [10][10] 
a[0][0] = 1 
puts a[0][0] 

这是我得到的;

#C:/Users/sangram/workspace/init/Main.rb:3:in `<main>': undefined method `[]' for #nil:NilClass (NoMethodError) 

我感到莫名其妙,我读了红宝石文档和似乎没有任何PDF文件的显示我任何方式如何读取标准输入到缓冲区中,然后用计数器++返回字节;

Requirement.Min

我需要这样的事情,

#buf = [] 
#counter = 0 
def readInt 
    #read(buf) 
    return buf[counter] 
    counter += 1 
end 

#main-code 
i = readInt 
#then i can do something like this 
puts i/2 
+0

-1懒惰(如大写)和误用标点符号。很难说出句子的结尾。 – sawa 2013-02-14 06:49:31

+0

请花时间写一个简洁的问题。你的游戏通过缓冲I/O和访问数组元素,并没有问一个具体的问题。 – 2013-02-14 13:45:25

回答

0

你的问题不太清楚,但我会解决它的一个方面:从标准输入

读取输入,尤其是从键盘上看,没有真正需要缓冲。当I/O设备忙于做其他事情时,缓冲输入用于为程序提供一个恒定的流。如果您正在等待用户键入内容,那么您可能会等待很长时间,而缓冲将没有优势。

如果您正在使用getsread从管道中读取,那么Ruby不需要对其进行缓冲,因为操作系统将缓冲Ruby的管道。

Ruby的I/O确实支持一些缓冲,操作系统也是如此。有关更多信息,请参阅“Understanding Ruby and OS I/O buffering”。

+0

谢谢,作为回复,虽然我需要快速I/O编程比赛。如果我能够读取标准输入缓冲区大小为1024字节的东西,那么我可以使用缓冲区来转换整数或字符串而不用等待用户。例如在谷歌代码拥挤比赛,如果我有红宝石测试。rb out.txt,我可以将in.txt中的所有数据读入缓冲区,如数组或其他东西,然后调用该数组来提取字节,最终我可以将其转换为整数,浮点数,字符串等。 – 2013-02-15 17:21:26

+0

是的,我知道像java中的bufferedInputstream或bufferedreader这样的ruby缓冲区,但仍然存在inputstream抽象类型,并且可以调用read(buff,offset,len)将数据读入byte [] buff,并读取buff字节。把它留下,@锡匠,我会自己做,人们总是只有一件事要说:“为什么你想这样做,而不是拿着你,反正,谢谢你的答复”...... – 2013-02-15 17:24:33