找回密码
 加入
搜索
楼主: 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 | 显示全部楼层
  1. #include <EditConstants.au3>
  2. #include <GUIConstantsEx.au3>
  3. #include <WindowsConstants.au3>
  4. #include <GuiStatusBar.au3>

  5. $txtFile = @ScriptDir & "\大于64KB出错.txt"
  6. $txtLang = 9500
  7. $n = 0
  8. ;----------------------------------------------------
  9. $Form1 = GUICreate("", 640, 505)
  10. Local $idMyedit = GUICtrlCreateEdit("", 0, 0, 640, 480, $ES_AUTOVSCROLL + $WS_VSCROLL)
  11. GUICtrlSetLimit($idMyedit, 100000000);解除edit控制限制为1亿字符
  12. ;任务栏
  13. $StatusBar1 = _GUICtrlStatusBar_Create($Form1)
  14. _GUICtrlStatusBar_SetMinHeight($StatusBar1, 25)
  15. _GUICtrlStatusBar_SetText($StatusBar1, " 【CRC16校验自动生成】 ")
  16. GUISetState(@SW_SHOW)
  17. ;-----------------------------------------------------
  18. Local $hFileOpen = FileOpen($txtFile, 0)
  19. ;----------------------------
  20. While 1
  21.         $line = FileReadLine($hFileOpen)
  22.         If @error = -1 Then
  23.                 FileClose($hFileOpen);文本文件读取异常就关闭
  24.                 ExitLoop
  25.         EndIf
  26.         If $n > $txtLang Then
  27.                 ExitLoop
  28.         Else
  29.                 GUICtrlSetData($idMyedit, $line & @CRLF, 0)
  30.                 _GUICtrlStatusBar_SetText($StatusBar1, $n & "行")
  31.         EndIf
  32.         $n = $n + 1
  33.         ;----------------------------------
  34. WEnd
  35. ;----------------------------
  36. FileClose($hFileOpen);文本文件读取异常就关闭

  37. While 1
  38.         Switch GUIGetMsg()
  39.                 Case $GUI_EVENT_CLOSE
  40.                         ExitLoop
  41.         EndSwitch

  42. 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楼附件
  1. #include <WinAPIConv.au3>
  2. #include <EditConstants.au3>
  3. #include <GUIConstantsEx.au3>
  4. #include <WindowsConstants.au3>

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

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

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

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

  34. While 1
  35.         Switch GUIGetMsg()
  36.                 Case $GUI_EVENT_CLOSE
  37.                         ExitLoop
  38.         Case $idOpensubitem
  39.                         $sFile = FileOpenDialog("选择文件...", @TempDir, "文本文件 (*.txt)")
  40.                         If @error <> 1 Then GUICtrlSetData($idMyedit, $sFile, 1)
  41.         EndSwitch
  42. WEnd
  43. 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#,麻烦也看看,指导一下,谢谢!
  1. Global $txtFile = @ScriptDir & "\大于64KB出错.txt"
  2. GUICreate("多国语言编辑器", 640, 480)
  3. Local $idFilemenu = GUICtrlCreateMenu("文件(&F)")
  4. GUICtrlCreateMenuItem("新建(&N)", $idFilemenu)
  5. Local $idOpensubitem = GUICtrlCreateMenuItem("打开(&O)...", $idFilemenu)
  6. GUICtrlCreateMenuItem("保存(&S)", $idFilemenu)
  7. GUICtrlCreateMenuItem("另存为(&A)...", $idFilemenu)
  8. GUICtrlCreateMenuItem("退出(&F)", $idFilemenu)
  9. Local $idViewmenu = GUICtrlCreateMenu("编码(&E)")
  10. GUICtrlCreateMenuItem("日文(&J)", $idViewmenu)
  11. GUICtrlCreateMenuItem("韩文(&K)", $idViewmenu)
  12. GUICtrlCreateMenuItem("繁体(&T)", $idViewmenu)
  13. GUICtrlCreateMenuItem("简体(&S)", $idViewmenu)
  14. Local $idHelpmenu = GUICtrlCreateMenu("帮助(&H)")
  15. GUICtrlCreateMenuItem("关于(&A)...", $idHelpmenu)
  16. Local $idMyedit = GUICtrlCreateEdit('', 0, 0, 640, 480)
  17. GUICtrlSetLimit(-1, 999999, 999999)
  18. GUICtrlSetData($idMyedit, _ReadFile($txtFile))
  19. GUISetState(@SW_SHOW)
  20. While 1
  21.         Switch GUIGetMsg()
  22.                 Case $GUI_EVENT_CLOSE
  23.                         ExitLoop
  24.                 Case $idOpensubitem
  25.                         $sFile = FileOpenDialog("选择文件...", @TempDir, "文本文件 (*.txt)")
  26.                         If @error <> 1 Then
  27.                                 GUICtrlSetData($idMyedit, _ReadFile($sFile), 1)
  28.                         EndIf
  29.                        
  30.         EndSwitch
  31. WEnd
  32. Func _ReadFile($txtFile, $txtLang = 950)
  33.         Local $hFile = FileOpen($txtFile, 16)
  34.         Local $bData = FileRead($hFile)
  35.         FileClose($hFile)
  36.        
  37.         Local $Buffer = DllStructCreate('byte [' & BinaryLen($bData) + 1 & ']')
  38.         DllStructSetData($Buffer, 1, $bData)
  39.         Return _WinAPI_MultiByteToWideChar($Buffer, $txtLang, False, True)
  40. EndFunc   ;==>_ReadFile
复制代码

评分

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

查看全部评分

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

本版积分规则

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

GMT+8, 2026-9-28 03:40 , Processed in 0.056230 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

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