精易论坛

标题: 修复黑月编译的【读入一行()】问题! [打印本页]

作者: hmyroot    时间: 2021-2-7 16:35
标题: 修复黑月编译的【读入一行()】问题!
本帖最后由 hmyroot 于 2021-2-7 18:13 编辑

最近在写Hosts文件修改程序遇到一个黑月编译的BUG,在易语言里调试运行没有任何问题,但用黑月编译就无法读入每一行,这种BUG有点坑因为没有任何错误提示,黑月编译的时候其实是将易语言的所有命令转为黑月自己的命令再编译,所以遇到这种错误非常麻烦。既然这个命令用不了但问题总得要解决,然后花了一个下午的研究终于搞掂这个BUG了,完美模仿易语言的读入一行()。黑月编译程序不知道还有没有大佬维护?@邓学彬 @被封七号
修复黑月读入一行()BUG.7z (61.4 KB, 下载次数: 12)


黑月编译后无法读入每一行,原因在处理换行符的时候出错


易语言自带的可以读入每一行


完美模仿易语言的读入一行()
  
子程序名返回值类型公开备 注
读入一行_黑月专版字节集 本命令用作从文件中当前读写位置读取并返回一行文本数据,如果读入失败将返回空字节集并且自动将当前文件读写位置移到文件尾部
参数名类 型参考可空数组备 注
文件号整数型该文件号由“打开文件”命令所返回的整数
抛弃换行符逻辑型如果为真,行末的回车符及换行符将被抛弃{13,10}
变量名类 型静态数组备 注
文件字节集字节集 
记录位置整数型2
换行处理字节集 
记录位置 [1]取读写位置 (文件号)
如果真 (记录位置 [1] = -1)
移到文件尾 (文件号)
返回 ({  })
文件字节集 = 读入字节集 (文件号, 取文件长度 (文件号) - 记录位置 [1])
' 调试输出 (文件字节集)
记录位置 [2]寻找字节集 (文件字节集, { 13, 10 }, 1)
如果真 (记录位置 [2] = -1)
记录位置 [2] = 记录位置 [1]
移动读写位置 (文件号, 1, 记录位置 [1])
换行处理 = 读入字节集 (文件号, 记录位置 [2] + 1)
' 调试输出 (取读写位置 (文件号))
如果真 (抛弃换行符)
换行处理 = 取字节集左边 (换行处理, 取字节集长度 (换行处理) - 2)
返回 (换行处理)



作者: 薆要执著    时间: 2021-2-7 16:44
你应该在黑月的官方git上提iss修复问题  这样黑月就更新了


作者: hmyroot    时间: 2021-2-7 16:49
薆要执著 发表于 2021-2-7 16:44
你应该在黑月的官方git上提iss修复问题  这样黑月就更新了

我没有Git账号,懒得上
作者: y2j423633    时间: 2021-2-7 17:19
薆要执著 发表于 2021-2-7 16:44
你应该在黑月的官方git上提iss修复问题  这样黑月就更新了

求最新版的黑月安装包不知道有没有呢
作者: hmyroot    时间: 2021-2-7 18:27
最新_修复删除换行符问题
  
子程序名返回值类型公开备 注
读入一行_黑月专版字节集 本命令用作从文件中当前读写位置读取并返回一行文本数据,如果读入失败将返回空字节集并且自动将当前文件读写位置移到文件尾部
参数名类 型参考可空数组备 注
文件号整数型该文件号由“打开文件”命令所返回的整数
抛弃换行符逻辑型如果为真,行末的回车符及换行符将被抛弃{13,10}
变量名类 型静态数组备 注
文件字节集字节集 
记录位置整数型2
换行处理字节集 
记录位置 [1]取读写位置 (文件号)
如果真 (记录位置 [1] = -1)
移到文件尾 (文件号)
返回 ({  })
文件字节集 = 读入字节集 (文件号, 取文件长度 (文件号) - 记录位置 [1])
' 调试输出 (到文本 (文件字节集))
记录位置 [2]寻找字节集 (文件字节集, { 13, 10 }, 1)
如果真 (记录位置 [2] = -1)
记录位置 [2] = 记录位置 [1]
移动读写位置 (文件号, 1, 记录位置 [1])
换行处理 = 读入字节集 (文件号, 记录位置 [2] + 1)
' 调试输出 (取读写位置 (文件号))
调试输出 (换行处理)
如果真 (抛弃换行符)
如果真 (倒找字节集 (换行处理, { 13, 10 }, ) ≠ -1)
换行处理 = 取字节集左边 (换行处理, 取字节集长度 (换行处理) - 2)

返回 (换行处理)


i支持库列表   支持库注释   
spec特殊功能支持库


作者: 凌哥    时间: 2021-2-7 20:22
同时支持 \r\n, \n\r, \r, \n 四种格式+高性能

  
子程序名返回值类型公开备 注
L_文件读写_读入一行文本型 从文件中当前读写位置读取并返回一行文本数据,自动判断换行符格式,支持各种换行符格式
参数名类 型参考可空数组备 注
文件句柄整数型
读入缓冲区长度整数型单位:字节; 默认为128; 根据你每一行数据大概多长来设置的话能够提升性能
返回_换行符格式文本型返回识别到的换行符格式
变量名类 型静态数组备 注
局_缓冲区字节集 
局_当前缓冲区长度整数型 
局_当前缓冲区指针整数型 
局_当前字节字节型 
局_下一个字节字节型 
局_偏移整数型 
局_读到文件尾逻辑型 
局_当前行字节集 
i整数型 
i2整数型 
如果真 (读入缓冲区长度 ≤ 0)
读入缓冲区长度 = 128
循环判断首 ()
局_缓冲区 = L_文件读写_读入字节集 (文件句柄, 读入缓冲区长度)  ' 每次读64字节
局_当前缓冲区长度 = L_字节集_取长度 (局_缓冲区)
如果真 (局_当前缓冲区长度 = 0)
返回 (取字节集数据 (局_当前行, #文本型, ))
如果真 (局_当前缓冲区长度 ≠ 读入缓冲区长度)
局_读到文件尾 = 真
局_当前缓冲区指针 = L_指针_取字节集指针 (局_缓冲区)
计次循环首 (局_当前缓冲区长度, i)
局_当前字节 = L_指针_到字节型 (局_当前缓冲区指针 + i - 1)
如果真 (局_当前字节 = 10 局_当前字节 = 13)
局_当前行 = 局_当前行 + 指针到字节集 (局_当前缓冲区指针, i - 1)
如果 (i = 局_当前缓冲区长度)
局_下一个字节 = 取字节集数据 (L_文件读写_读入字节集 (文件句柄, 1), #字节型, )
如果真 (局_下一个字节 ≠ 0)
' 如果下一个字节不是10或13 读写位置就退回一位
局_偏移 = 0
如果 (局_当前字节 = 10)
如果真 (局_下一个字节 ≠ 13)
局_偏移 = 1

如果真 (局_下一个字节 ≠ 10)
局_偏移 = 1

L_文件读写_移动读写位置 (文件句柄, -局_偏移, 1)  ' 退回多读取的数据

局_下一个字节 = L_指针_到字节型 (局_当前缓冲区指针 + i)
' 如果下一个字节是10或者13 读写位置退回时额外前进一位
局_偏移 = 0
如果 (局_当前字节 = 10)
如果真 (局_下一个字节 = 13)
局_偏移 = 1

如果真 (局_下一个字节 = 10)
局_偏移 = 1

L_文件读写_移动读写位置 (文件句柄, i - 局_当前缓冲区长度 + 局_偏移, 1)  ' 退回多读取的数据

如果 (局_当前字节 = 10)
如果 (局_下一个字节 = 13)
返回_换行符格式 = 字符 (10)字符 (13)
返回_换行符格式 = 字符 (10)

如果 (局_下一个字节 = 10)
返回_换行符格式 = 字符 (13)字符 (10)
返回_换行符格式 = 字符 (13)


' 调试输出 (局_当前行, i - 局_当前缓冲区长度)
返回 (取字节集数据 (局_当前行, #文本型, ))

计次循环尾 ()
局_当前行 = 局_当前行 + 局_缓冲区
如果真 (L_文件读写_是否在文件尾 (文件句柄))
返回 (取字节集数据 (局_当前行, #文本型, ))

循环判断尾 (文件句柄 ≠ 0)
返回 (“”)


作者: 凌哥    时间: 2021-2-7 20:31
为了能更快捷地访问GitHub 顺手写了个hosts配置类
https://125.confly.eu.org/forum.php?mod=viewthread&tid=14665792

作者: 被封七号    时间: 2021-2-7 23:31
感谢楼主反馈的问题,该问题已得到修复,可前往黑月问题反馈群(820528017),在群共享中的测试版本目录中下载。
作者: 寡人i    时间: 2021-2-8 00:22
支持一下
作者: 飞飞怕冷    时间: 2021-2-22 08:56
这个不错下来备用
作者: wx88456123    时间: 2021-6-30 01:07
hmyroot 发表于 2021-2-7 18:27
最新_修复删除换行符问题
[e=4].版本 2
.支持库 spec

大佬QQ 多少找你有个小事
作者: ghost12    时间: 2022-2-22 05:00
大神,请收下我的膝盖
作者: ghost12    时间: 2022-3-26 19:03
欢迎常来帮助新人,谢谢~
作者: 老任    时间: 2022-4-5 22:30
支持开源~!感谢分享
作者: kklotebo    时间: 2023-9-24 00:52
没那么麻烦,自己也遇到这个坑了。自己写了一个
目前看来运行还可以

[JavaScript] 纯文本查看 复制代码
.版本 2

.子程序 读入一行_修复版, 文本型, 公开
.参数 文件号, 整数型, , 该文件号由“打开文件”命令所返回的整数
.参数 文件长度, 长整数型
.局部变量 文件字节集, 字节集
.局部变量 记录位置, 整数型, , "3"
.局部变量 换行处理, 字节集
.局部变量 局部读取长度, 整数型
.局部变量 实际位置, 整数型

记录位置 [1] = 取读写位置 (文件号)
.如果真 (记录位置 [1] = -1)
    移到文件尾 (文件号)
    返回 (“”)
.如果真结束
换行处理 = {  }
.循环判断首 ()
    .如果 (文件长度 > 记录位置 [1] + 128)
        局部读取长度 = 128
    .否则
        局部读取长度 = 文件长度 - 记录位置 [1]
    .如果结束
    文件字节集 = 读入字节集 (文件号, 局部读取长度)
    ' 输出调试文本 (到文本 (文件字节集))
    记录位置 [2] = 寻找字节集 (文件字节集, { 13 }, 1)
    记录位置 [3] = 寻找字节集 (文件字节集, { 10 }, 1)
    .如果 (记录位置 [2] = -1 且 记录位置 [3] = -1)
        换行处理 = 换行处理 + 文件字节集
        记录位置 [1] = 记录位置 [1] + 局部读取长度
    .否则
        .如果 (记录位置 [2] > 记录位置 [3])
            实际位置 = 记录位置 [2]
        .否则
            实际位置 = 记录位置 [3]
        .如果结束
        移动读写位置 (文件号, 1, 记录位置 [1])
        换行处理 = 换行处理 + 读入字节集 (文件号, 实际位置)
        跳出循环 ()
    .如果结束

.循环判断尾 (真)

返回 (子文本替换 (子文本替换 (到文本 (换行处理), 字符 (13), , , , 真), 字符 (10), , , , 真))

作者: kklotebo    时间: 2023-10-19 15:08
kklotebo 发表于 2023-9-24 00:52
没那么麻烦,自己也遇到这个坑了。自己写了一个
目前看来运行还可以

128个字符内没有换行符,会继续读取128个。




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4