下午好StackOverflow,
我刚刚在这里注册 - 我已经使用这个网站多年了,似乎总是提供答案的网站,所以我决定参与其中。
不用多说,这是我的问题 -
我正在为局域网派对编写一个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'杀'等等等等。一个示例代码片段会很棒!
先谢谢你们。
答案 0 :(得分:3)
这是一个可用于加载文件内容的函数:
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
希望这有助于您开始......
测试代码:
注意:确保覆盖任何预先存在的代码
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 Body = 2 Head = 1”。
答案 1 :(得分:0)
我会看到实时,读写的一个问题是两个或更多计算机或应用程序是否尝试打开同一个文件。这可能有点混乱。
答案 2 :(得分: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
现在这只是你可以做的一个例子。