代码之家  ›  专栏  ›  技术社区  ›  Fernando

StreamReader返回另一个字符

  •  2
  • Fernando  · 技术社区  · 16 年前

    我试图用一个StreamReader读取一个文件的内容,它接收一个文件流。文件中有一些空格(char 32),StreamReader将它们读取为0(char 48)。屏幕截图显示了FileStream缓冲区和StreamReader缓冲区。两者的值都是32,但是当我调用Read()时,它返回48。我在这里遗漏了什么吗?顺便说一下,代码是在.NET Compact Framework下运行的。

    alt text 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和Default都不起作用)

    编辑: 输入如下所示:

    000636920000000532000404100100000001041000000001041000000001031000000000000000000000000000000000000000001730173017301730203020302030203021302130213021300027900267841515150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280010000000280010000000280010000020
    260007464616011007464816011009005321011009005621011010041621011010041821011013574026011013574226011014564729011014564929011018343318021018343618021020035418021020035618021022583818021022584018021005474302031005474502031010311305031010311505031011265308031011265508031011265508031011274108031021524009
    0310215242090310060151130310063110130310160022210310160024210310022837280310022839280310                                                                                                                                                                                                                    
                                                                                                                                                                                                                                            00206377740002484841000029844400181529330003034081000000000000000000
    

    问题发生在从第三行开始到第四行的空格上。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Henk Holterman    16 年前

    要解决这个问题,您必须为每个属性创建一个新的StreamReader,并且要小心

    但我会一次读完它(都是文本,对吧?)并对字符串进行操作。

        2
  •  5
  •   Doug    16 年前

    我怀疑你的问题是 Encoding.ASCII . 你确定你的文件是这样编码的吗?我敢打赌你的文件是用 Encoding.Unicode ,这就是为什么你会遇到零。

    在这种情况下,您说您的编码是UTF-8,所以将您的编码设置为 Encoding.UTF8