gpt4 book ai didi

ruby - 如何将一行文本写入文件中间?

转载 作者:太空宇宙 更新时间:2023-11-03 16:14:44 26 4
gpt4 key购买 nike

我有一个用 Ruby 编写的命令行日记应用程序。我希望能够回溯新条目并将条目按时间顺序写入文件。这些是多行条目,因此事后简单排序是不够的。我知道如何将一行附加到文本文件的末尾:

def write(file, entry)
open(file, 'r+') do |f|
f.write entry
end
end

但是,假设我有一个名为 line_number 的变量,其中包含我要开始写入的位置。有没有一种简单的方法可以从行号 line_number 开始将 entry 写入 file,同时保留原始内容?

例如,给定一个包含以下内容的文件:

a
c

调用方法 write_at(file, 2, 'b') 应该产生:

a
b
c

最佳答案

这样做的主要问题是,如果您无法将整个文件加载到内存中,文本文件是只能在最后修改的顺序文件,而不是可以在任何位置修改的二进制文件在文件中。如果您可以以一种可以保证所有记录的字节长度相等的方式存储数据,那么您可以找到所需的位置并将其后的所有内容有效地移动一个记录,然后插入所需的记录。因此,您只需重写文件的一部分。如今,这并不常见,但有可能。

如果您要使用这种二进制存储格式,那么您可以有一个单独的东西将其格式化为日志行。

更好的方法是使用像 SQLite 这样的数据库;这将为您进行插入和移动(使用“位置”字段)。

2018-02-08 添加:

更准确地说,问题不在于文件内容是文本还是二进制文件的技术问题,而在于是否可以轻松计算指定数据的位置而无需从头读取文件来找到它。除非文本在固定长度的记录中,否则通常无法在不读取文件内容的情况下计算文本字符串的位置。

此外,二进制与文本是一种文件打开模式(从技术上讲,如果不是实际的话)可以应用于任何文件,但文件必须以二进制模式打开才能可靠地使用文件搜索命令。对于将新行转换为多个字符的操作系统(我相信 Windows 仍会将它们转换为“\r\n”),二进制模式会将两个字符串视为两个字节而不是一个字符。

关于ruby - 如何将一行文本写入文件中间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48591641/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com