Как заменить «плохие символы» в текстовом файле пробелом в VB.NET

Я пытаюсь избавить текстовый файл от поврежденных данных. Я разбираю файл и, если нахожу неверный символ, заменяю его пробелом. Моя проблема в том, что пробел не перезаписывает плохой символ. Вместо этого пробел написан в строке 10 позиции 27. Что здесь происходит? Я застрял на этой, казалось бы, простой задаче на полдня. Спасибо.

     Sub replaceChars(fname As String)
        Dim fs As New FileStream(fname, FileMode.Open, FileAccess.ReadWrite)
        Dim r As New StreamReader(fs)
        Dim w As New StreamWriter(fs)
        Dim iChar As Integer = 0

        Do Until r.Peek() = -1
          iChar = r.Read()
          If iChar < 32 Or iChar > 126 Then
            If iChar = 13 Or iChar = 10 Then  'cr/lf, continue.
              Continue Do
            Else 'found a bad char. replace it.
              w.Write(Chr(32))
              w.Flush()
              fs.Flush()
            End If
          Else
            Continue Do
          End If
        Loop
        w.Close()
        fs.Close()
      End Sub

person user3023401    schedule 22.11.2013    source источник
comment
FileStream использует буфер, по умолчанию 4096 байт. Первая запись будет сделана по смещению 4096, а не туда, куда вы надеетесь. Вы не можете сделать FileStream.Seek() надежным для текстового файла. Запишите все в другой файл, File.Replace() после того, как закончите.   -  person Hans Passant    schedule 23.11.2013
comment
Спасибо! Я преобразовал строки в массивы символов и заменил значения в массиве. затем преобразовал массив символов обратно в строку. как вы предложили, я использовал временный файл для записи, а затем скопировал содержимое из временного файла в реальный файл. еще раз спасибо.   -  person user3023401    schedule 25.11.2013


Ответы (1)


Мне действительно не нравится идея, что вы разделяете файловый поток для чтения и записи, так как у меня было много «необоснованных» проблем из-за этого.

Я понял, что при использовании объектов Idiposable используйте оператор «Использование», который гарантирует, что процессы завершены, и вы не получаете связанных ошибок.

попробуйте это, может быть, это поможет, и всегда лучше делать это так.

Использование заявления

person bto.rdz    schedule 22.11.2013
comment
Спасибо. как вы предложили, я разделил файловые потоки чтения и записи. и я использую оператор using для писателя. теперь это работает. - person user3023401; 25.11.2013