1

我正在编写一些代码来搜索文件开头的文件,直到找到一个字符串。

这是有效的代码:

    Private Function ReadTextFileUpto(ByVal txtFile As String, ByVal searchString As String) As String
        Dim result As String = String.Empty
        Dim sb As New System.Text.StringBuilder()
        Dim previousLength As Integer = 0
        Using reader As New IO.StreamReader(txtFile)
            'Read the file 1 char at a time and append it to sb
            While reader.Peek >= 0
                sb.Append(Convert.ToChar(reader.Read))
                'store the current length of sb
                previousLength = sb.Length
                'attemp to replace the search string with an empty string. If the length changed after the replacement
                'then the following conditions must be true:
                ' 1. we have found the search string in sb.
                ' 2. the search string was at the end of sb.
                sb.Replace(searchString, String.Empty)
                If sb.Length < previousLength Then
                    'since we have found the search string,  exit the loop and return the string currently in sb.
                    result = sb.ToString()
                    Exit While
                End If
            End While
        End Using
        Return result
    End Function

我想编辑 thsi 代码,以便我可以在文件中选择一个起始位置来开始搜索。

这是我正在处理的代码:

    Public Function ReadTextFileUpto(ByVal txtFile As String, ByVal searchString As String, integerStartPosition As Integer) As String
    Dim result As String = String.Empty
    Dim sb As New System.Text.StringBuilder()
    Dim previousLength As Integer = 0
    Using reader As New IO.StreamReader(txtFile)
        'Read the file 1 char at a time and append it to sb
        While reader.Peek >= integerStartPosition
            sb.Append(Convert.ToChar(reader.Read))
            'store the current length of sb
            previousLength = sb.Length
            'attemp to replace the search string with an empty string. If the length changed after the replacement
            'then the following conditions must be true:
            ' 1. we have found the search string in sb.
            ' 2. the search string was at the end of sb.
            sb.Replace(searchString, String.Empty)
            If sb.Length < previousLength Then
                'since we have found the search string,  exit the loop and return the string currently in sb.
                result = sb.ToString()
                Exit While
            End If
        End While
    End Using
    Return result
End Function

我可以帮忙吗?

最终代码

Public Function ReadTextFileUpto(ByVal txtFile As String, ByVal searchString As String, integerStartPosition As Integer) As String
    Dim result As String = String.Empty
    Dim sb As New System.Text.StringBuilder()
    Dim tmpString As String = ""
    Dim previousLength As Integer = -1
    Dim integerCurrentPosition As Integer 
    Using reader As New IO.StreamReader(txtFile)
        While reader.Peek >= 0

            integerCurrentPosition += 1

            tmpString = Convert.ToChar(reader.Read)

            If integerCurrentPosition > integerStartPosition Then
                sb.Append(tmpString)
                previousLength = sb.Length
                sb.Replace(searchString, String.Empty)
                If sb.Length < previousLength Then
                    result = sb.ToString()
                    Exit While
                End If
            End If

        End While
    End Using
    Return result
End Function
4

1 回答 1

0

您应该将位置检查放在 while 循环中。这是一个简单的例子。

Private Function ReadTextFileUpto(ByVal txtFile As String, ByVal searchString As String) As String
            Dim result As String = String.Empty
            Dim sb As New System.Text.StringBuilder()
            Dim previousLength As Integer = 0
            Dim currentPosition as Integer = 0

            Using reader As New IO.StreamReader(txtFile)
                'Read the file 1 char at a time and append it to sb
                While reader.Peek >= 0
                    If currentPosition < integerStartPosition Then
                       Continue While
                    End if 

                    sb.Append(Convert.ToChar(reader.Read))
                    'store the current length of sb
                    previousLength = sb.Length
                    'attemp to replace the search string with an empty string. If the length changed after the replacement
                    'then the following conditions must be true:
                    ' 1. we have found the search string in sb.
                    ' 2. the search string was at the end of sb.
                    sb.Replace(searchString, String.Empty)
                    If sb.Length < previousLength Then
                        'since we have found the search string,  exit the loop and return the string currently in sb.
                        result = sb.ToString()
                        Exit While
                    End If

                    currentPosition = currentPosition + 1
                End While
            End Using
            Return result
        End Function

更新:

或者您可以尝试StreamReader.Read Method (Char[], Int32, Int32)方法将流读入数组,指定起始位置。

从当前流中读取最多 count 个字符到缓冲区,从 index 开始。

欲了解更多信息检查教程

流阅读器

祝你好运!

于 2012-09-06T06:01:17.410 回答