StreamReader возвращает другой символ - PullRequest
2 голосов
/ 14 мая 2010

Я пытаюсь прочитать содержимое файла с помощью StreamReader, который получает FileStream. В файле есть несколько пробелов (char 32), и StreamReader читает их как 0 (char 48). На снимке экрана показаны буфер FileStream и буфер StreamReader. Оба имеют значение 32, но когда я вызываю Read (), он возвращает 48. Я что-то здесь упускаю? Кстати, код работает под .NET Compact Framework.

альтернативный текст http://www.freeimagehosting.net/uploads/9f72b61bbe.png

Код, который читает данные:

public void Read() {
 using (StreamReader reader = new StreamReader(InputStream, Encoding.UTF8)) {
  foreach (var property in DataObject.EnumerateProperties()) {
   OffsetInfo offset = property.GetTextOffset();
   reader.BaseStream.Position = offset.Start - 1;
   StringBuilder builder = new StringBuilder(offset.Size);
   int count = 0;
   while (reader.Peek() >= 0 && count < offset.Size) {
    char c = (char)reader.Read();
    if ((int)c != 32 && c != '\r' && c != '\n')  {
     builder.Append(c);
     count++;
    } else {
     reader.BaseStream.Position++;
    }
   }
   property.SetValue(DataObject,
    Convert.ChangeType(builder.ToString(), property.PropertyType, CultureInfo.CurrentCulture),
    null
   );
  }
 }
}

РЕДАКТИРОВАТЬ: Изменение кодировки не работает (ни Unicode, ни по умолчанию)

РЕДАКТИРОВАТЬ: Ввод выглядит так:

000636920000000532000404100100000001041000000001041000000001031000000000000000000000000000000000000000001730173017301730203020302030203021302130213021300027900267841515150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280010000000280010000000280010000020
260007464616011007464816011009005321011009005621011010041621011010041821011013574026011013574226011014564729011014564929011018343318021018343618021020035418021020035618021022583818021022584018021005474302031005474502031010311305031010311505031011265308031011265508031011265508031011274108031021524009
0310215242090310060151130310063110130310160022210310160024210310022837280310022839280310                                                                                                                                                                                                                    
                                                                                                                                                                                                                                        00206377740002484841000029844400181529330003034081000000000000000000

Проблема возникает с пробелами, которые начинаются в третьей строке и переходят в четвертую.

Ответы [ 3 ]

5 голосов
/ 14 мая 2010

Я подозреваю, что ваша проблема - Encoding.ASCII. Вы уверены, что ваш файл закодирован таким образом? Держу пари, что ваш файл на самом деле закодирован Encoding.Unicode, поэтому вы сталкиваетесь с нулями.

В этом случае вы говорите, что кодируете UTF-8, поэтому установите кодировку на Encoding.UTF8 и посмотрите, что произойдет.

2 голосов
/ 14 мая 2010

ОК, я только что провела небольшой тест. Перестановка BaseStream не работает для TextReader, поэтому вы просто читаете из другой позиции, чем вы думаете (и проверяете в окне Watch).

Чтобы решить эту проблему, вам придется создать новый StreamReader для каждого свойства, и будьте осторожны , а не , чтобы закрыть его (не используйте блок using).

Но я бы прочитал все сразу (это весь текст, верно?) И работал бы над строкой (ами).

1 голос
/ 14 мая 2010

Я не уверен, что это основная проблема, но ваш цикл чтения выглядит некорректно.

Попробуйте изменить его на:

    while (reader.Peek() >= 0 && count < offset.Size)
    {
        char c = (char)reader.Read();
        if (c != ' ' && c != '\r' && c != '\n')
        {
            builder.Append(c);
            count++;
        }
        //else
        //{
        //    reader.BaseStream.Position++;
        //}
    }

И в вашем окне Debugger Watch я бы использовал reader.Peek() вместо reader.Read()

И: Возможно ли, что после пробела в вашем вводе стоит '0'?

...