【问题标题】:StreamReader returning another charStreamReader 返回另一个字符
【发布时间】:2011-02-19 13:22:40
【问题描述】:

我正在尝试使用接收 FileStream 的 StreamReader 读取文件的内容。该文件内部有一些空格(字符 32),StreamReader 将它们读取为 0(字符 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 和默认编码均无效)

编辑:输入如下所示:

000636920000000532000404100100000001041000000001041000000001031000000000000000000000000000000000000000001730173017301730203020302030203021302130213021300027900267841515150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000280010000000280010000000280010000020
260007464616011007464816011009005321011009005621011010041621011010041821011013574026011013574226011014564729011014564929011018343318021018343618021020035418021020035618021022583818021022584018021005474302031005474502031010311305031010311505031011265308031011265508031011265508031011274108031021524009
0310215242090310060151130310063110130310160022210310160024210310022837280310022839280310                                                                                                                                                                                                                    
                                                                                                                                                                                                                                        00206377740002484841000029844400181529330003034081000000000000000000

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

【问题讨论】:

    标签: c# .net compact-framework stream streamreader


    【解决方案1】:

    好的,我刚刚进行了一个小测试。重新定位 BaseStream 不适用于 TextReader,因此您只是从另一个位置读取,而不是您认为的位置(并且正在查看 Watch 窗口)。

    要解决这个问题,您必须为每个属性创建一个新的 StreamReader,并小心 不要 关闭它(不要使用 using 块)。

    但我会一次性阅读所有内容(都是文本,对吗?)并对字符串进行操作。

    【讨论】:

    • 虽然我没有使用过你的解决方案,但你的测试让我想到了调用 reader.DiscardBufferedData(),这就成功了。谢谢!
    【解决方案2】:

    我怀疑你的问题是Encoding.ASCII。你确定你的文件是这样编码的吗?我敢打赌你的文件实际上是用Encoding.Unicode 编码的,这就是你遇到零的原因。

    在这种情况下,您说您的编码是 UTF-8,所以将您的编码设置为 Encoding.UTF8 看看会发生什么。

    【讨论】:

    • 或者使用Encoding.Default,这是你的windows系统的默认编码(不是StreamReader的默认编码,因为你很容易想到......)
    • 它没有用。该文件是 UTF-8。但改变这一点并不能解决问题。
    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2016-10-20
    相关资源
    最近更新 更多