1

私はVB.Netでそれを行う方法を知っていますが、vb6のアイデアではありません.
私が達成すべきことは、ファイル全体を読み取らないようにすることです。
それは可能ですか?

4

3 に答える 3

1

ランダム アクセスを使用してファイルを開くことができます。キャリッジ リターンとライン フィードの文字ペアの数を数えながら、一度に 1 バイトずつ逆方向に作業します。各行を配列などに格納し、400 行を読み終えたら停止します。

于 2012-10-29T15:10:44.740 に答える
1

コメットビルは良い答えを持っています。

ランダム アクセス用にファイルを開くには:

Open filename For Random Access Read As #filenumber Len = reclength

ファイルの長さをバイト単位で取得するには:

FileLen(ByVal PathName As String) As Long

ランダム アクセス ファイルから読み取るには:

Get [#]filenumber,<[recnumber]>,<varname>

重要:関数の<varname>from はGet固定長の文字列である必要があります。そうしないと、変数がこのように可変長の文字列として宣言されている場合Dim varname as String * 1にエラーが発生しますBad record length (Error 59)Dim varname as String

編集:

Dim varname as String * 1固定長の文字列を定義していて、長さが 1 であることを指摘しておきたいと思います。これは、read-1-byte-backwards アプローチを使用する場合です。ファイルに固定長のレコードがある場合、一度に 1 バイトずつ移動する必要はありません。一度に 1 レコードずつ読み取ることができます (キャリッジ リターンと改行のために 2 バイトを追加することを忘れないでください)。後者の場合、Dim varname as String * XX がレコード長 + 2 であると定義します。次に、400 回逆方向に、またはファイルの先頭に到達するまで単純なループを実行します。

于 2012-10-29T15:41:07.503 に答える
0

以下は、これに対する私の見解です。ファイル全体をメモリに保存する必要がないため、ファイルが非常に大きい場合、これは前の 2 つの回答よりも効率的です。

Option Explicit

Private Sub Command_Click()

    Dim asLines()                           As String

    asLines() = LoadLastLinesInFile("C:\Program Files (x86)\VMware\VMware Workstation\open_source_licenses.txt", 400)

End Sub

Private Function LoadLastLinesInFile(ByRef the_sFileName As String, ByVal the_nLineCount As Long) As String()

    Dim nFileNo                             As Integer
    Dim asLines()                           As String
    Dim asLinesCopy()                       As String
    Dim bBufferWrapped                      As Boolean
    Dim nLineNo                             As Long
    Dim nLastLineNo                         As Long
    Dim nNewLineNo                          As Long
    Dim nErrNumber                          As Long
    Dim sErrSource                          As String
    Dim sErrDescription                     As String

    On Error GoTo ErrorHandler

    nFileNo = FreeFile

    Open the_sFileName For Input As #nFileNo

    On Error GoTo ErrorHandler_FileOpened

    ' Size our buffer to the number of specified lines.
    ReDim asLines(0 To the_nLineCount - 1)
    nLineNo = 0

    ' Read all lines until the end of the file.
    Do Until EOF(nFileNo)
        Line Input #nFileNo, asLines(nLineNo)
        nLineNo = nLineNo + 1
        ' Check to see whether we have got to the end of the string array.
        If nLineNo = the_nLineCount Then
            ' In which case, flag that we did so, and wrap back to the beginning.
            bBufferWrapped = True
            nLineNo = 0
        End If
    Loop

    Close nFileNo

    On Error GoTo ErrorHandler

    ' Were there more lines than we had array space?
    If bBufferWrapped Then
        ' Create a new string array, and copy the bottom section of the previous array into it, followed
        ' by the top of the previous array.
        ReDim asLinesCopy(0 To the_nLineCount - 1)
        nLastLineNo = nLineNo
        nNewLineNo = 0
        For nLineNo = nLastLineNo + 1 To the_nLineCount - 1
            asLinesCopy(nNewLineNo) = asLines(nLineNo)
            nNewLineNo = nNewLineNo + 1
        Next nLineNo
        For nLineNo = 0 To nLastLineNo
            asLinesCopy(nNewLineNo) = asLines(nLineNo)
            nNewLineNo = nNewLineNo + 1
        Next nLineNo
        ' Return the new array.
        LoadLastLinesInFile = asLinesCopy()
    Else
        ' Simply resize down the array, and return it.
        ReDim Preserve asLines(0 To nLineNo)
        LoadLastLinesInFile = asLines()
    End If

Exit Function

ErrorHandler_FileOpened:
    ' If an error occurred whilst reading the file, we must ensure that the file is closed
    ' before reraising the error. We have to backup and restore the error object.
    nErrNumber = Err.Number
    sErrSource = Err.Source
    sErrDescription = Err.Description
    Close #nFileNo
    Err.Raise nErrNumber, sErrSource, sErrDescription

ErrorHandler:
    Err.Raise Err.Number, Err.Source, Err.Description
End Function
于 2012-10-30T09:28:04.930 に答える