找回密码
 加入
搜索
楼主: chishingchan

[AU3基础] 【已解决】读取文本文件大于 64KB 就出错!

[复制链接]
发表于 2023-8-22 10:06:04 | 显示全部楼层
按你们代码修改了一下
发表于 2023-8-22 10:09:33 | 显示全部楼层

正确代码如上。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2023-8-22 10:13:21 | 显示全部楼层
读字符是有字符数量限止,不会无究的。正确脚本如上。
发表于 2023-8-22 10:14:31 | 显示全部楼层
chishingchan 发表于 2023-8-20 15:21
64KB 文本文件被限制问题已附代码,请a大帮忙看看,谢谢!

以处理,自己查看
 楼主| 发表于 2023-8-22 13:55:19 | 显示全部楼层

第7行 950 是语言代码,并非行数!
_WinAPI_MultiByteToWideChar 这个不能撤!否则读通天也没用!不符合要求!
发表于 2023-8-22 14:08:18 | 显示全部楼层
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiStatusBar.au3>

$txtFile = @ScriptDir & "\大于64KB出错.txt"
$txtLang = 9500
$n = 0
;----------------------------------------------------
$Form1 = GUICreate("", 640, 505)
Local $idMyedit = GUICtrlCreateEdit("", 0, 0, 640, 480, $ES_AUTOVSCROLL + $WS_VSCROLL)
GUICtrlSetLimit($idMyedit, 100000000);解除edit控制限制为1亿字符
;任务栏
$StatusBar1 = _GUICtrlStatusBar_Create($Form1)
_GUICtrlStatusBar_SetMinHeight($StatusBar1, 25)
_GUICtrlStatusBar_SetText($StatusBar1, " 【CRC16校验自动生成】 ")
GUISetState(@SW_SHOW)
;-----------------------------------------------------
Local $hFileOpen = FileOpen($txtFile, 0)
;----------------------------
While 1
        $line = FileReadLine($hFileOpen)
        If @error = -1 Then
                FileClose($hFileOpen);文本文件读取异常就关闭
                ExitLoop
        EndIf
        If $n > $txtLang Then
                ExitLoop
        Else
                GUICtrlSetData($idMyedit, $line & @CRLF, 0)
                _GUICtrlStatusBar_SetText($StatusBar1, $n & "行")
        EndIf
        $n = $n + 1
        ;----------------------------------
WEnd
;----------------------------
FileClose($hFileOpen);文本文件读取异常就关闭

While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        ExitLoop
        EndSwitch

WEnd
能处理啊!没有问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2023-8-22 14:12:55 | 显示全部楼层
qq413774005 发表于 2023-8-22 14:08
能处理啊!没有问题。


你的效果达不到!看图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2023-8-22 14:16:36 | 显示全部楼层
afan 发表于 2023-8-22 09:06
512 是 ANSI
2、3 必须的
4 他这是转换为繁体系统使用的文本(代码页950),所以光靠BinaryToString估计 ...

我的完整代码,大于64KB出错.txt 在1楼附件
#include <WinAPIConv.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;修改这两个变量就好!
$txtFile = @ScriptDir & "\大于64KB出错.txt"
$txtLang = 950
;Locale                LCID        16                10                Codepage
;中文(中国)        zh-CN        0804        2052        936
;中文(台湾)        zh-TW        0404        1028        950
;英语(美国)        en_US        0409        1033        437
;日语                ja                0411        1041        932
;朝鲜语                ko                0412        1042        949

Local $hFileOpen = FileOpen($txtFile, $FO_ANSI)
Local $sFileRead = FileRead($hFileOpen)    ;, 65536)
FileClose($hFileOpen)
$new = _WinAPI_MultiByteToWideChar($sFileRead, $txtLang, False, True)

GUICreate("多国语言编辑器", 640, 480)
Local $idFilemenu = GUICtrlCreateMenu("文件(&F)")
GUICtrlCreateMenuItem("新建(&N)", $idFilemenu)
Local $idOpensubitem = GUICtrlCreateMenuItem("打开(&O)...", $idFilemenu)
GUICtrlCreateMenuItem("保存(&S)", $idFilemenu)
GUICtrlCreateMenuItem("另存为(&A)...", $idFilemenu)
GUICtrlCreateMenuItem("退出(&F)", $idFilemenu)
Local $idViewmenu = GUICtrlCreateMenu("编码(&E)")
GUICtrlCreateMenuItem("日文(&J)", $idViewmenu)
GUICtrlCreateMenuItem("韩文(&K)", $idViewmenu)
GUICtrlCreateMenuItem("繁体(&T)", $idViewmenu)
GUICtrlCreateMenuItem("简体(&S)", $idViewmenu)
Local $idHelpmenu = GUICtrlCreateMenu("帮助(&H)")
GUICtrlCreateMenuItem("关于(&A)...", $idHelpmenu)

Local $idMyedit = GUICtrlCreateEdit($new, 0, 0, 640, 480)
GUISetState(@SW_SHOW)

While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        ExitLoop
        Case $idOpensubitem
                        $sFile = FileOpenDialog("选择文件...", @TempDir, "文本文件 (*.txt)")
                        If @error <> 1 Then GUICtrlSetData($idMyedit, $sFile, 1)
        EndSwitch
WEnd
GUIDelete()

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2023-8-22 14:33:48 | 显示全部楼层
haijie1223 发表于 2023-8-22 00:30
1、FileOpen的第2个参数512是什么意思,没看到有这个值啊。
2、GUICtrlCreateEdit创建的时候赋值为空,去 ...

发哥,代码图片已更新在 23#,麻烦也看看,指导一下,谢谢!
发表于 2023-8-22 15:50:32 | 显示全部楼层
两种方法都跟你说了,始终没有尝试?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2023-8-22 16:14:41 | 显示全部楼层
afan 发表于 2023-8-22 15:50
两种方法都跟你说了,始终没有尝试?

是分段吗?觉得有点复杂。求解决代码,谢谢!
发表于 2023-8-22 16:46:33 | 显示全部楼层
chishingchan 发表于 2023-8-22 16:14
是分段吗?觉得有点复杂。求解决代码,谢谢!

两种都可以,看你需求了

点评

你随意,我都行!  发表于 2023-8-22 17:08
 楼主| 发表于 2023-8-22 17:19:34 | 显示全部楼层
afan 发表于 2023-8-20 18:05
这就不是 FileRead 读取多少的问题了,而是 MultiByteToWideChar 的问题 (官方也有说明,调用此函数很容易 ...

代入结构是使用 DllStructCreate 吗?
发表于 2023-8-22 18:40:55 | 显示全部楼层
chishingchan 发表于 2023-8-22 17:19
代入结构是使用 DllStructCreate 吗?

是的,用 DllStructCreate 创建结构最好是 byte,且先 StringToBinary 将读取到的数据转换下~

评分

参与人数 1金钱 +50 收起 理由
chishingchan + 50 很给力!

查看全部评分

发表于 2023-8-22 20:37:50 | 显示全部楼层
chishingchan 发表于 2023-8-22 14:33
发哥,代码图片已更新在 23#,麻烦也看看,指导一下,谢谢!
Global $txtFile = @ScriptDir & "\大于64KB出错.txt"
GUICreate("多国语言编辑器", 640, 480)
Local $idFilemenu = GUICtrlCreateMenu("文件(&F)")
GUICtrlCreateMenuItem("新建(&N)", $idFilemenu)
Local $idOpensubitem = GUICtrlCreateMenuItem("打开(&O)...", $idFilemenu)
GUICtrlCreateMenuItem("保存(&S)", $idFilemenu)
GUICtrlCreateMenuItem("另存为(&A)...", $idFilemenu)
GUICtrlCreateMenuItem("退出(&F)", $idFilemenu)
Local $idViewmenu = GUICtrlCreateMenu("编码(&E)")
GUICtrlCreateMenuItem("日文(&J)", $idViewmenu)
GUICtrlCreateMenuItem("韩文(&K)", $idViewmenu)
GUICtrlCreateMenuItem("繁体(&T)", $idViewmenu)
GUICtrlCreateMenuItem("简体(&S)", $idViewmenu)
Local $idHelpmenu = GUICtrlCreateMenu("帮助(&H)")
GUICtrlCreateMenuItem("关于(&A)...", $idHelpmenu)
Local $idMyedit = GUICtrlCreateEdit('', 0, 0, 640, 480)
GUICtrlSetLimit(-1, 999999, 999999)
GUICtrlSetData($idMyedit, _ReadFile($txtFile))
GUISetState(@SW_SHOW)
While 1
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        ExitLoop
                Case $idOpensubitem
                        $sFile = FileOpenDialog("选择文件...", @TempDir, "文本文件 (*.txt)")
                        If @error <> 1 Then
                                GUICtrlSetData($idMyedit, _ReadFile($sFile), 1)
                        EndIf
                        
        EndSwitch
WEnd
Func _ReadFile($txtFile, $txtLang = 950)
        Local $hFile = FileOpen($txtFile, 16)
        Local $bData = FileRead($hFile)
        FileClose($hFile)
        
        Local $Buffer = DllStructCreate('byte [' & BinaryLen($bData) + 1 & ']')
        DllStructSetData($Buffer, 1, $bData)
        Return _WinAPI_MultiByteToWideChar($Buffer, $txtLang, False, True)
EndFunc   ;==>_ReadFile

评分

参与人数 2威望 +2 金钱 +200 贡献 +40 收起 理由
afan + 100 确实直接二进制打开比512好,省了StringToB.
chishingchan + 2 + 100 + 40 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-2 08:01 , Processed in 0.076777 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表