2

下午好 StackOverflow,

我刚刚在这里注册——我已经使用这个网站很长时间了,而且它似乎总是提供答案的网站,所以我决定参与其中。

事不宜迟,这是我的问题-

我正在为我和一个小组每月编写的 LAN 聚会编写一个 API,以帮助解决记分方面的问题。我的朋友正在为它编写后端,而我正在编写 VB6 前端。自从我写VB6以来已经有一段时间了,我从来没有像我在这里瞄准的前端等级那样认真地写它。

该程序的前提是 - 后端将我们正在玩的游戏中的事件实时写入文本文件 - 前端实时读取该文件。我现在想询问的部分是——

我知道您可以在 VB6 中逐行阅读文本文件。我希望程序“倾听”(可以这么说)某些流行语并使用它们定义的“值”来影响变量。这是它将要读取的文件类型的模拟示例-

******************
LANrealm Match Log
******************

Game:       Call of Duty 4
Game Type:  Team Deathmatch
Date:       01-Jan-2013
Time:       19:00:00
Players:    Tramp
        Roper
        d00b
        Pleb
Score Limit:    150

Event:  Game Start  
Event:  Roper killed Pleb (M4A1) shots=5 Feet=2 Body=2 Head=1 
Event:  Tramp committed suicide (Fall damage)
Event:  Tramp killed d00b (Grenade)
Event:  Pleb said "I'm saying something"
Event:  Pleb teamkilled d00b (G3) shots=3 Feet=0 Body=2 Head=1 
Event:  Game Finished

Winner: Roper

Roper:  Kills=1,Deaths=0,Suicides=0,Teamkills=0
Tramp:  Kills=1,Deaths=0,Suicides=1,Teamkills=0
Pleb:   Kills=0,Deaths=0,Suicides=0,Teamkills=1
d00b:   Kills=0,Deaths=0,Suicides=0,Teamkills=0

好吧,我想只要看看这个,你就可以知道我想让程序从中挑选什么。如果我只是把它完全用逗号分隔会容易得多,但我想保持原始文本文件的可读性。但是,是的,以防万一您没有得到它,我希望程序能够识别“Roper”有 1 个“Kill”,依此类推。一个示例代码片段会很棒!

提前谢谢各位。

4

3 回答 3

4

这是一个可用于加载文件内容的函数:

Public Function LoadFile(dFile As String) As String

    Dim ff As Integer

    On Error Resume Next

    ff = FreeFile
    Open dFile For Binary As #ff
        LoadFile = Space(LOF(ff))
        Get #ff, , LoadFile
    Close #ff

End Function

接下来,您要拆分该文件的输出。首先,您需要知道后端将生成哪种类型的 EOL 终止字符。假设每一行都以回车符 (13) 和换行符 (10) 结尾,您可以使用以下代码将每一行存储到一个字符串数组中:

Dim lines() As String
lines = Split(LoadFile("LANrealm.log"), vbCrLf)

最后,循环遍历每一行(使用 For...Next 循环)并查找您要提取的任何信息:

For i = 0 To Ubound(lines)
    ' Add here necessary logic to extract the information.
    ' Each line can be accessed by indexing the array as: lines(i)
Next

希望这可以帮助您入门...


要测试代码:

  • 启动 VB6 并创建一个新项目。VB6 将使用一种形式创建一个空项目
  • 双击表格查看
  • 右键单击工具箱并选择“组件”
  • 找到“Microsoft Common Dialog Control”并选择它
  • 点击确定
  • 现在,将“CommonDialog”组件从工具箱拖到窗体上
  • 双击表单查看其源代码
  • 粘贴以下代码

注意:确保覆盖任何预先存在的代码

Option Explicit

Private Sub Form_Load()
    cDlg.DefaultExt = "txt"
    cDlg.Filter = "Text Files|*.txt;*.log"
    cDlg.ShowOpen

    If cDlg.fileName <> "" Then AnalyzeFile .fileName
End Sub

Private Sub AnalyzeFile(fileName As String)
    Dim fileContents As String
    Dim lines() As String
    Dim i As Integer

    fileContents = LoadFile(fileName)
    lines = Split(fileContents, vbCrLf)

    For i = 0 To UBound(lines)
        If InStr(1, lines(i), "event:", vbTextCompare) Then
            MsgBox "Line #" & i & " contains the string 'event'" + vbCrLf + vbCrLf + lines(i)
        End If
    Next
End Sub

Private Function LoadFile(dFile As String) As String
    Dim ff As Integer
    On Error Resume Next

    ff = FreeFile
    Open dFile For Binary As #ff
        LoadFile = Space(LOF(ff))
        Get #ff, , LoadFile
    Close #ff
End Function

运行程序,当被要求提供文件时,选择将由后端生成的日志之一。

在本例中,程序会告诉您哪些行包含“事件信息”,例如“事件:Roper 杀死 Pleb (M4A1) 射击=5 英尺=2 身体=2 头部=1”。

于 2013-01-15T16:11:58.817 回答
0

我会看到实时读取和写入的一个问题是,如果两台或多台计算机或应用程序尝试打开同一个文件。这可能有点混乱。

于 2013-01-19T07:56:54.953 回答
0

好的,所以如果你真的想逐行读取你的文件,我会稍微改变你的日志文件。

******************
LANrealm Match Log
******************

Game:  Call of Duty 4
Game Type:  Team Deathmatch
Date: 01-Jan-2013
Time:1 9:00:00
Players: Tramp, Roper, d00b, Pleb
Score Limit:    150

Event:  Game Start  
Event:  Roper killed Pleb (M4A1) shots=5 Feet=2 Body=2 Head=1 
Event:  Tramp committed suicide (Fall damage)
Event:  Tramp killed d00b (Grenade)
Event:  Pleb said "I'm saying something"
Event:  Pleb teamkilled d00b (G3) shots=3 Feet=0 Body=2 Head=1 
Event:  Game Finished

Winner: Roper

Stat: Roper Kills=1,Deaths=0,Suicides=0,Teamkills=0
Stat: Tramp Kills=1,Deaths=0,Suicides=1,Teamkills=0
Stat: Pleb Kills=0,Deaths=0,Suicides=0,Teamkills=1
Stat: d00b Kills=0,Deaths=0,Suicides=0,Teamkills=0

您可以使用它逐行读取文件。

   Dim FileNo As Integer
   Dim TempData As String
   Dim TempStr As String
   FileNo = FreeFile
   Open "c:\game.log" For Input As FileNo
      Do
         Line Input #FileNo, TempStr
         TempData = TempData & TempStr or do what ever you want it to do with that line.
         DoEvents
      Loop Until EOF(FileNo)
   Close #FileNo
   MsgBox TempData

但是,我建议将整个文件读入一个字符串,然后解析出你想要的信息。如果你这样做了,你可以选择你可能想要的信息,比如游戏名称等......

试试这个。创建一个新模块,并将其粘贴到其中。

Public Function ParseData(DataSTR As String, StartSTR As String, EndSTR As String) As String
   Dim Split1
   Dim Split2
   Split1 = Split(DataSTR, StartSTR, , 1)
   Split2 = Split(Split1(1), EndSTR, , 1)
   SplitParse = Split2(0)
End Function

然后将其添加到命令按钮。

Private Sub Command2_Click()
 Dim FileNo As Integer
   Dim TempData As String
   FileNo = FreeFile
   Open "c:\game.log" For Input As FileNo
      TempData = Input(LOF(FileNo), FileNo)
   Close
   MsgBox TempData
   MsgBox Trim(ParseData(TempData, "Game:", Chr(10)))
End Sub

现在,这只是您可以做的一个示例。

于 2013-01-22T05:12:44.477 回答