qq413774005 发表于 2023-8-22 10:06:04

按你们代码修改了一下

qq413774005 发表于 2023-8-22 10:09:33

qq413774005 发表于 2023-8-22 10:05


正确代码如上。

qq413774005 发表于 2023-8-22 10:13:21

读字符是有字符数量限止,不会无究的。正确脚本如上。

qq413774005 发表于 2023-8-22 10:14:31

chishingchan 发表于 2023-8-20 15:21
64KB 文本文件被限制问题已附代码,请a大帮忙看看,谢谢!

以处理,自己查看

chishingchan 发表于 2023-8-22 13:55:19

qq413774005 发表于 2023-8-22 10:05


第7行 950 是语言代码,并非行数!
_WinAPI_MultiByteToWideChar 这个不能撤!否则读通天也没用!不符合要求!

qq413774005 发表于 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

能处理啊!没有问题。

chishingchan 发表于 2023-8-22 14:12:55

qq413774005 发表于 2023-8-22 14:08
能处理啊!没有问题。


你的效果达不到!看图:

chishingchan 发表于 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()

chishingchan 发表于 2023-8-22 14:33:48

haijie1223 发表于 2023-8-22 00:30
1、FileOpen的第2个参数512是什么意思,没看到有这个值啊。
2、GUICtrlCreateEdit创建的时候赋值为空,去 ...

发哥,代码图片已更新在 23#,麻烦也看看,指导一下,谢谢!

afan 发表于 2023-8-22 15:50:32

两种方法都跟你说了,始终没有尝试?

chishingchan 发表于 2023-8-22 16:14:41

afan 发表于 2023-8-22 15:50
两种方法都跟你说了,始终没有尝试?
是分段吗?觉得有点复杂。求解决代码,谢谢!

afan 发表于 2023-8-22 16:46:33

chishingchan 发表于 2023-8-22 16:14
是分段吗?觉得有点复杂。求解决代码,谢谢!

两种都可以,看你需求了

chishingchan 发表于 2023-8-22 17:19:34

afan 发表于 2023-8-20 18:05
这就不是 FileRead 读取多少的问题了,而是 MultiByteToWideChar 的问题 (官方也有说明,调用此函数很容易 ...

代入结构是使用 DllStructCreate 吗?

afan 发表于 2023-8-22 18:40:55

chishingchan 发表于 2023-8-22 17:19
代入结构是使用 DllStructCreate 吗?

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

haijie1223 发表于 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
页: 1 [2] 3
查看完整版本: 【已解决】读取文本文件大于 64KB 就出错!