`
Hooopo
  • 浏览: 336006 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NewLine and File Separator in Ruby

    博客分类:
  • Ruby
阅读更多

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里有没有一个优雅的解决方式呢?

分享到:
评论
14 楼 Hooopo 2009-06-16  
| ・´ェ`・|
13 楼 night_stalker 2009-06-16  
Matz 写道

In Ruby, we use / for path separator to enhance script portability.  You can use File::ALT_SEPARATOR but it's a second class citizen in Ruby world.


Issue 被 reject 了……
建议将 monkey patch 代码加入自己的 support 中,并在说明中引用 Matz 的话 | ・´ェ`・|
12 楼 Hooopo 2009-06-16  
night_stalker 写道
这个 SEPARATOR 确实是个问题,好一点的方法是重新定义 File.join ……
if RUBY_PLATFORM =~ /mswin/
  class << File
    alias fvckjoin join
    def join a, b
      fvckjoin(a,b).gsub '/','\\'
    end
  end
end

刚刚提交了 Issue,不知道会不会有人理。


if RUBY_PLATFORM =~ /mswin/
  class << File
    alias fvckjoin join
    def join *args
      fvckjoin(*args).gsub '/','\\'
    end
  end
end

File.join可以多个参数。。
11 楼 night_stalker 2009-06-16  
这个 SEPARATOR 确实是个问题,好一点的方法是重新定义 File.join ……
if RUBY_PLATFORM =~ /mswin/
  class << File
    alias fvckjoin join
    def join a, b
      fvckjoin(a,b).gsub '/','\\'
    end
  end
end

刚刚提交了 Issue,不知道会不会有人理。
10 楼 Hooopo 2009-06-16  
icefishc 写道
Hooopo 写道

output:
104
101
108
108
111
126
126
10


是的

这么看来ruby的\n还很神奇呢,,,哇咔咔
9 楼 icefishc 2009-06-16  
Hooopo 写道

output:
104
101
108
108
111
126
126
10


是的
8 楼 Hooopo 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

7 楼 icefishc 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

或者你拿记事本打开看一下就知道了
6 楼 Hooopo 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"



5 楼 icefishc 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
4 楼 icefishc 2009-06-16  
file = File.new("temp.txt", "w")
file.print("hello~~\n");
file.print("hello~~\n");
file.print("hello~~\n");
file.close

哦 这个是输出时才能体现出来. 你打印到文件里看一下.
我把我的测试结果也传上来了
3 楼 Hooopo 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

2 楼 Hooopo 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"符号的。

1 楼 icefishc 2009-06-16  
首先先纠正LZ的一个笔误。
Windows下的换行符是\r\n *nix下是\n

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

相关推荐

    count blank,table and newline.cpp

    count blank,table and newline.cpp

    java-IO.rar_File and java

    本资料"java-IO.rar_File and java"聚焦于Java I/O流在读写文件以及文件替换方面的实践应用。 一、Java I/O 流概述 Java I/O流模型基于流的概念,流可以看作是数据的序列,可以从源(如文件或网络连接)读取,也...

    plsqldev13.0.1.1893x32主程序+ v12中文包+keygen

    Regular expression popup menu had a double entry for the Tab character (\t) and no entry for the Newline character (\n) Insert column value highlighting did not work when using a RETURNING INTO clause...

    前端开源库-single-trailing-newline

    "single-trailing-newline" 是一个针对这个目标而设计的开源库,它专注于确保字符串在结束时拥有一个单一的尾随换行符。这个库的出现解决了不同开发者在编写代码时对换行符处理不一致的问题,尤其是在多人协作项目中...

    plsqldev13.0.1.1893x64主程序+ v12中文包+keygen

    Regular expression popup menu had a double entry for the Tab character (\t) and no entry for the Newline character (\n) Insert column value highlighting did not work when using a RETURNING INTO clause...

    FileReadWrite with text aread output.zip_In Writing_file readers

    `FileReadWrite with text aread output.zip_In Writing_file readers`这个标题暗示了我们将会探讨如何在Java中读取和写入文本文件。让我们详细地了解这个主题。 首先,Java提供了一些内置的类来处理文件I/O操作,...

    在消息框中换行输出信息,C#源代码MessageBox.Show("编程技巧大全系列包括:" + Environment.NewLine +

    在消息框中换行输出信息,C#源代码MessageBox.Show("编程技巧大全系列包括:" + Environment.NewLine + "Visual C# 2008编程技巧大全:" + Environment.NewLine + "Visual Basic 2008编程技巧大全:" + Environment...

    File文件的操作

    在Android系统中,`File`类是用于操作文件和目录的基本工具。它是Java.io.File类的一个子类,但在Android环境中,有一些特定的注意事项和最佳实践。以下是对`File`类在Android中的使用进行的详细说明。 ### 文件...

    java中IO流里面的关于File的讲解源码

    在Java编程语言中,`File`类是处理文件和目录的核心类,位于`java.io`包下。这个类提供了一系列的方法来操作文件和目录,包括创建、删除、重命名、获取属性等。当我们谈论`File`类与IO流的结合时,主要是指使用`File...

    编程实现先从标准输入中读取字符串,然后将字符串存到文件file1中,最后再将文件file1中的内容读取另存到文件file2中等功能。

    bufferedWriter2.newLine(); // 添加换行符 } // 关闭流 bufferedWriter2.close(); bufferedReader1.close(); ``` 7. **异常处理**: 在实际编程中,上述操作可能抛出`IOException`,因此应使用try-catch...

    File手机文件操作

    bw.newLine(); bw.close(); ``` 4. **文件的读写权限** 在Android 6.0(API级别23)及以上版本,应用需要在运行时请求写入外部存储的权限。可以使用`ActivityCompat.checkSelfPermission()`检查权限,` ...

    loadData批量导入以及压缩协议使用指南1

    MySQL的`LOAD DATA INFILE`语句是一种高效的数据批量导入方法,它的性能通常是单条`INSERT`语句的几十倍,特别适用于大数据量的导入。从Mycat 1.4版本开始,它开始支持MySQL的压缩协议,这对于处理大量数据和大结果...

    shell cheat sheet

    For example, `IFS=$'\n'` sets the separator to newline characters. - **Shell Name**: `$SHELL` returns the name of the shell that is currently executing the script. - **Language**: `$LANG` specifies ...

    (wc) word count

    Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified. With no FILE, or when FILE is -, read standard input. -c, --bytes print the byte counts -m, -...

    File merge文件合并

    File file1 = new File("file1.txt"); File file2 = new File("file2.txt"); File outputFile = new File("mergedFile.txt"); try (BufferedReader reader1 = new BufferedReader(new FileReader(file1)); ...

    前端开源库-is-newline

    开源库 `is-newline` 正是针对这一需求而诞生的,它专注于判断一个给定的字符串是否包含换行符。这个小巧且高效的库能够帮助开发者在处理文本时更加精准地识别和操作换行。 `is-newline` 库的核心功能在于其简单的...

    Newline 使用智能视频显示器轻松协作

    然而,通信和协作是受到高度重视的业务实践。根据 Gallup 报告,在全球范围内,缺乏协作和敬业精神导致的生产力损失大约为 7 万亿美元。当今时代,分散在不同地理位置处的移动员工使得团队合作更具挑战性。...

    VC6.0常见编译错误提示附解决方法

    (1)error C2001: newline in constant 编号:C2001直译:在常量中出现了换行。错误分析: 1.①字符串常量、字符常量中是否有换行。2.②在这句语句中,某个字符串常量的尾部是否漏掉了双引号。3.③在这语句中,某个...

    FileIO.rar_FileIo_andriod driver_android_android 文件_android 读

    在Android系统中,文件输入/输出(File Input/Output,简称FileIO)是应用程序与本地存储交互的基础。本文将深入探讨Android平台上的文件操作,包括读取、写入、创建和管理文件,以及如何利用驱动程序进行高效的数据...

    NewLine.zip

    NewLine.zip

Global site tag (gtag.js) - Google Analytics