论坛首页 编程语言技术论坛

NewLine and File Separator in Ruby

浏览 4746 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-16   最后修改:2009-06-16

ruby 1.8.6 on windows File.join总生成“/”作为File Separator:

 

File.expand_path(File.join(File.dirname(__FILE__),"..","lib"))
#=> "C:/Documents and Settings/lib"

 而File::SEPARATOR也默认是"/"

 

File::SEPARATOR
=> "/"

 尽管Windows API支持"/"和"\"两种形式。但是在cmd里面,windows却不能识别"/"。让人有点不爽...

似乎这个问题可以这样解决:

 

File::REAL_SEPARATOR = File::ALT_SEPARATOR || File::SEPARATOR
File.join('dir','file').gsub(File::SEPARATOR,File::REAL_SEPARATOR)

#on win => dir\name
#on *nix => dir/name

 但是,为什么ruby不能自动根据平台自己决定separator呢?或是说为什么windows下默认separator不是"\"呢?

还有更糟糕的换行...

匹配或替换不同系统产生的换行问题很好解决,用正则\s很容易搞定。

不管怎么说File Separator已经在ruby里是一个常量存在。但是newline却只能硬编码成"\n"或"\r\n"

为什么没有一个这样的常量:String::NEWLINE 

在windows 返回 "\r\n",*nix返回 "\n"

 

不知道上面上面说的两个问题ruby里有没有一个优雅的解决方式呢?

   发表时间:2009-06-16   最后修改:2009-06-16
首先先纠正LZ的一个笔误。
Windows下的换行符是\r\n *nix下是\n

第二个问题有点冤枉ruby了
\n在ruby中(perl也一样)表示换行符, 而不是实际的'\n'(ascii 10)
在windows中它就是'\r\n'
0 请登录后投票
   发表时间:2009-06-16  
icefishc 写道
首先先纠正LZ的一个笔误。
Windows下的换行符是\r\n *nix下是\r

第二个问题有点冤枉ruby了
\n在ruby中(perl也一样)表示换行符, 而不是实际的'\n'(ascii 10)
在windows中它就是'\r\n'

'\n' 10 换行(newline)
'\r' 13 回车(return)

也可以表示为'\x0a'和'\x0d'.(16进制)

在windows系统下,回车换行符号是"\r\n".但是在Linux等系统下是没有"\r"符号的。

0 请登录后投票
   发表时间:2009-06-16  
icefishc 写道
首先先纠正LZ的一个笔误。
Windows下的换行符是\r\n *nix下是\r

第二个问题有点冤枉ruby了
\n在ruby中(perl也一样)表示换行符, 而不是实际的'\n'(ascii 10)
在windows中它就是'\r\n'

perl我不知道,但是ruby里的"\n"就是ascii 10,看下面代码:
irb(main):034:0> "\n".size
=> 1
irb(main):035:0> p "\n"[0]
10

0 请登录后投票
   发表时间:2009-06-16   最后修改:2009-06-16
file = File.new("temp.txt", "w")
file.print("hello~~\n");
file.print("hello~~\n");
file.print("hello~~\n");
file.close

哦 这个是输出时才能体现出来. 你打印到文件里看一下.
我把我的测试结果也传上来了
0 请登录后投票
   发表时间:2009-06-16  
Hooopo 写道
icefishc 写道
首先先纠正LZ的一个笔误。
Windows下的换行符是\r\n *nix下是\r

第二个问题有点冤枉ruby了
\n在ruby中(perl也一样)表示换行符, 而不是实际的'\n'(ascii 10)
在windows中它就是'\r\n'

'\n' 10 换行(newline)
'\r' 13 回车(return)

也可以表示为'\x0a'和'\x0d'.(16进制)

在windows系统下,回车换行符号是"\r\n".但是在Linux等系统下是没有"\r"符号的。


-_-||| 手滑了..... 是\n
0 请登录后投票
   发表时间:2009-06-16  
icefishc 写道
file = File.new("temp.txt", "w")
file.print("hello~~\n");
file.print("hello~~\n");
file.print("hello~~\n");
file.close

哦 这个是输出时才能体现出来. 你打印到文件里看一下.
我把我的测试结果也传上来了

file = File.new("temp.txt", "w")
file.print("hello~~\n");
file.print("hello~~\n");
file.print("hello~~\n");
file.close
File.open("temp.txt","r") do |f|
  p f.read
end

结果:
"hello~~\nhello~~\nhello~~\n"



0 请登录后投票
   发表时间:2009-06-16   最后修改:2009-06-16
Hooopo 写道

"hello~~\nhello~~\nhello~~\n"

:( 这个是ruby输出的问题, 他会把换行输出成\n。 不是真实的内用
#include <cstdio>
int main(){
  FILE *input = fopen("temp.txt", "r");
  for(int i = 0; i < 9; i++)
    printf("%d\n", fgetc(input));
}
output:
104
101
108
108
111
126
126
13
10

或者你拿记事本打开看一下就知道了
0 请登录后投票
   发表时间:2009-06-16  
icefishc 写道
Hooopo 写道

"hello~~\nhello~~\nhello~~\n"

:( 这个是ruby输出的问题, 他会把换行输出成\n。 不是真实的内用
#include <cstdio>
int main(){
  FILE *input = fopen("temp.txt", "r");
  for(int i = 0; i < 9; i++)
    printf("%d\n", fgetc(input));
}
output:
104
101
108
108
111
126
126
13
10

或者你拿记事本打开看一下就知道了


记事本看不到的..
这么说上面同样的程序在linux下会产生这样结果?:
output:
104
101
108
108
111
126
126
10

0 请登录后投票
   发表时间:2009-06-16  
Hooopo 写道

output:
104
101
108
108
111
126
126
10


是的
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics