crystal-lang - 如何在 Crystal 中读取一定数量的字符(而不是字节)?

标签 crystal-lang

在 Crystal 中,如果我有一个字符串(或一个文件),如何一次读取一定数量的字符使用像这样的函数IO#readIO#getsIO#read_stringIO#read_utf8,可以指定一定的字节数读取,但不是一定数量的 UTF-8 字符(或其他编码的字符)。

例如,在 Python 中,可以这样做:

from io import StringIO

s = StringIO("abcdefgh")
while True:
    chunk = s.read(4)
    if not chunk: break

或者,对于文件,这是:

with open("example.txt", 'r') as f:
    while True:
        chunk = f.read(4)
        if not chunk: break

通常,我希望 IO::Memory 是用于字符串大小写的类,但据我所知,它的方法不允许这样做。 如何以一种高效和惯用的方式做到这一点(对于字符串和文件——也许每个答案都不同)在 Crystal 中?

最佳答案

目前在 Crystal 中没有对此可用的快捷方式实现。

您可以使用 IO#read_char 读取单个字符或使用 IO#each_char 读取连续的字符。

所以一个基本的实现是:

io = IO::Memory.new("€abcdefgh") 

string = String.build(4) do |builder|
  4.times do
    builder << io.read_char
  end
end

puts string

无论您使用内存 IO 还是文件或任何其他 IO 都是无关紧要的,行为都是一样的。

关于crystal-lang - 如何在 Crystal 中读取一定数量的字符(而不是字节)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65289805/

相关文章:

crystal-lang - 什么是 Crystal Lang 中的父类(super class)不匹配?

crystal-lang - 嵌套哈希生成错误

crystal-lang - 如何使用 HTTP::Server 同时流式传输多个文件?

crystal-lang - 可以将 Ruby gems 与 Crystal 一起使用吗?

crystal-lang - 键入别名和哈希作为方法参数

mysql - 创建 NamedTuple 数组时输入 Mismatch Crystal

crystal-lang - Crystal 郎 : in case of a Class as a field

concurrency - 我怎样才能停止光纤?

crystal-lang - 运行 shell 命令 Crystal 语言并捕获输出

crystal-lang - Crystal 语言:使用什么代替运行时 String::to_sym