2

こんにちは。

ここにサインアップしたところです - 私はこのサイトを何年も使用してきましたが、常に答えを提供するサイトであるように思われるので、私は物事の一部になることに決めました.

これ以上苦労することなく、ここに私の質問があります -

私とグループがスコア管理側で物事を整理するのを助けるために毎月持っている LAN パーティーのための API を書いています。私の友人はそのバックエンドを書いており、私は VB6 フロントエンドを書いています。VB6を書いてからずいぶん経ちましたが、ここで目指しているフロントエンドのグレードほど集中して書いたことはありません。

プログラムの前提は次のとおりです。バックエンドは、プレイしているゲームのイベントをテキスト ファイルにリアルタイムで書き込みます。フロントエンドは、それをリアルタイムで読み取ります。現時点でお聞きしたいのは、この部分です。

VB6 では、テキスト ファイルを 1 行ずつ読み取ることができます。私は、プログラムが特定の流行語を (いわば) 「聞き取り」、定義済みの「値」を使用して変数に影響を与えるようにしたいと考えています。これは、読み取るファイルの種類のモック例です-

******************
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」には「Kill​​」が 1 つあることをプログラムに認識させたいと思います。コードスニペットの例は素晴らしいでしょう!

よろしくお願いします。

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 は 1 つのフォームで空のプロジェクトを作成します
  • フォームをダブルクリックして表示します
  • ツールボックスを右クリックし、「コンポーネント」を選択します
  • 「Microsoft Common Dialog Control」を見つけて選択します
  • [OK] をクリックします。
  • 次に、「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

プログラムを実行し、ファイルの提供を求められたら、バックエンドによって生成されるログの 1 つを選択します。

この例では、プログラムはどの行に「イベント情報」が含まれているかを教えてくれます。たとえば、「イベント: ローパーがプレブ (M4A1) を撃ち殺した = 5 足 = 2 体 = 2 頭 = 1」などです。

于 2013-01-15T16:11:58.817 に答える
0

これをリアルタイムで読み取りと書き込みを行う際に見られる問題の 1 つは、2 つ以上のコンピューターまたはアプリが同じファイルを開こうとした場合です。これは少し混乱する可能性があります。

于 2013-01-19T07:56:54.953 に答える
0

わかりましたので、本当にファイルを 1 行ずつ読みたい場合は、ログファイルを少し変更します。

******************
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

これを使用して、ファイルを 1 行ずつ読み取ることができます。

   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 に答える