精易论坛
标题: 修复黑月编译的【读入一行()】问题! [打印本页]
作者: hmyroot 时间: 2021-2-7 16:35
标题: 修复黑月编译的【读入一行()】问题!
本帖最后由 hmyroot 于 2021-2-7 18:13 编辑
最近在写Hosts文件修改程序遇到一个黑月编译的BUG,在易语言里调试运行没有任何问题,但用黑月编译就无法读入每一行,这种BUG有点坑因为没有任何错误提示,黑月编译的时候其实是将易语言的所有命令转为黑月自己的命令再编译,所以遇到这种错误非常麻烦。既然这个命令用不了但问题总得要解决,然后花了一个下午的研究终于搞掂这个BUG了,完美模仿易语言的读入一行()。黑月编译程序不知道还有没有大佬维护?@邓学彬 @被封七号
修复黑月读入一行()BUG.7z
(61.4 KB, 下载次数: 12)
黑月编译后无法读入每一行,原因在处理换行符的时候出错
易语言自带的可以读入每一行
完美模仿易语言的读入一行()
|
读入一行_黑月专版 | 字节集 | |
|
文件号 | 整数型 | | | |
抛弃换行符 | 逻辑型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
文件字节集 | 字节集 | | |
记录位置 | 整数型 | | 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
我没有Git账号
,懒得上
作者: y2j423633 时间: 2021-2-7 17:19
求最新版的黑月安装包不知道有没有呢
作者: hmyroot 时间: 2021-2-7 18:27
最新_修复删除换行符问题
|
读入一行_黑月专版 | 字节集 | |
|
文件号 | 整数型 | | | |
抛弃换行符 | 逻辑型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
文件字节集 | 字节集 | | |
记录位置 | 整数型 | | 2 |
换行处理 | 字节集 | | |
记录位置
[1
] =
取读写位置 (文件号
)
如果真 (记录位置
[1
] = -1
)
移到文件尾 (文件号
)
返回 ({ })文件字节集 = 读入字节集 (文件号, 取文件长度 (文件号) - 记录位置 [1]) 记录位置
[2
] =
寻找字节集 (文件字节集,
{ 13, 10
}, 1
)
如果真 (记录位置
[2
] = -1
)
记录位置
[2
] = 记录位置
[1
]移动读写位置 (文件号, 1, 记录位置 [1])换行处理 =
读入字节集 (文件号, 记录位置
[2
] + 1
) 调试输出 (换行处理
)
如果真 (抛弃换行符
)
如果真 (倒找字节集 (换行处理,
{ 13, 10
},
) ≠ -1
)

换行处理 =
取字节集左边 (换行处理,
取字节集长度 (换行处理
) - 2
)
返回 (换行处理)
作者: 凌哥 时间: 2021-2-7 20:22
同时支持 \r\n, \n\r, \r, \n 四种格式+高性能
|
L_文件读写_读入一行 | 文本型 | |
|
文件句柄 | 整数型 | | | |
读入缓冲区长度 | 整数型 | | | | 返回_换行符格式 | 文本型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
局_缓冲区 | 字节集 | | |
局_当前缓冲区长度 | 整数型 | | |
局_当前缓冲区指针 | 整数型 | | |
局_当前字节 | 字节型 | | |
局_下一个字节 | 字节型 | | |
局_偏移 | 整数型 | | |
局_读到文件尾 | 逻辑型 | | |
局_当前行 | 字节集 | | |
i | 整数型 | | |
i2 | 整数型 | | |
如果真 (读入缓冲区长度 ≤ 0
)
读入缓冲区长度 = 128
循环判断首 ()
局_缓冲区 =
L_文件读写_读入字节集 (文件句柄, 读入缓冲区长度
) 
局_当前缓冲区长度 =
L_字节集_取长度 (局_缓冲区
)
如果真 (局_当前缓冲区长度 = 0
)
返回 (取字节集数据 (局_当前行,
#文本型, ))

如果真 (局_当前缓冲区长度 ≠ 读入缓冲区长度
)

局_读到文件尾 = 真
局_当前缓冲区指针 = L_指针_取字节集指针 (局_缓冲区)
计次循环首 (局_当前缓冲区长度, i
)

局_当前字节 =
L_指针_到字节型 (局_当前缓冲区指针 + i - 1
)

如果真 (局_当前字节 = 10
或 局_当前字节 = 13
)


局_当前行 = 局_当前行 +
指针到字节集 (局_当前缓冲区指针, i - 1
)


如果 (i = 局_当前缓冲区长度
)



局_下一个字节 =
取字节集数据 (L_文件读写_读入字节集 (文件句柄, 1
),
#字节型, )



如果真 (局_下一个字节 ≠ 0
)








局_偏移 = 0





如果 (局_当前字节 = 10
)





如果真 (局_下一个字节 ≠ 13
)






局_偏移 = 1













如果真 (局_下一个字节 ≠ 10
)





局_偏移 = 1










L_文件读写_移动读写位置 (文件句柄, -局_偏移, 1)









局_下一个字节 =
L_指针_到字节型 (局_当前缓冲区指针 + i
)






局_偏移 = 0




如果 (局_当前字节 = 10
)




如果真 (局_下一个字节 = 13
)





局_偏移 = 1











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




局_偏移 = 1








L_文件读写_移动读写位置 (文件句柄, i - 局_当前缓冲区长度 + 局_偏移, 1)







如果 (局_当前字节 = 10
)



如果 (局_下一个字节 = 13
)




返回_换行符格式 =
字符 (10
) +
字符 (13
)




返回_换行符格式 =
字符 (10
)








如果 (局_下一个字节 = 10
)




返回_换行符格式 =
字符 (13
) +
字符 (10
)




返回_换行符格式 =
字符 (13
)












返回 (取字节集数据 (局_当前行,
#文本型, ))




计次循环尾 ()
局_当前行 = 局_当前行 + 局_缓冲区

如果真 (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
大佬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
128个字符内没有换行符,会继续读取128个。
欢迎光临 精易论坛 (https://125.confly.eu.org/) |
Powered by Discuz! X3.4 |