StreamReader返回另一个字符
我正在尝试使用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
问题发生在从第三行开始到第四行的空间上。
好的,我只是进行了一些测试。 对TextReader重新定位BaseStream不起作用,因此您只是从另一个位置读取超出自己的位置(并正在检查Watch窗口中)。
要解决这个问题,你必须为每个属性创建一个新的StreamReader,注意不要关闭它(不要使用using块)。
但我会马上去阅读它(全部是文字,对吧?)并对字符串进行操作。
我怀疑你的问题是Encoding.ASCII
。 你肯定你的文件是用这种方式编码的吗? 我打赌你的文件实际上是用Encoding.Unicode
,这就是为什么你遇到零。
在这种情况下,你说你的编码是UTF-8,所以把你的编码设置为Encoding.UTF8
,看看会发生什么。
我不确定这是否是核心问题,但您的阅读循环看起来有缺陷。
尝试将其更改为:
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'?
链接地址: http://www.djcxy.com/p/53661.html