在c#.net 4.0(真正4.5.2)中,我的代码读取一个UTF-8文件。
FileStream fstream = new FileStream(path, FileMode.Open);
BufferedStream stream = new BufferedStream(fstream);
using (StreamReader reader = new StreamReader(stream, new UTF8Encoding())) {
int i;
while((i = reader.Read()) > -1) {
//a guess at a condition that is true I.F.F. reader has read character 1 of the file
if (stream.Position == (0 + sizeof(char)) || stream.Position == (0 + sizeof(int)) ) {
//while loop has reader read through all characters,
//but within this block, the reader has surely read character 1?
char c = (char)i;
}
}
reader.Close();
return 0;
}
i.f.f。我们达到了流程阅读UTF-8文件的开始字符的条件,然后在第一个字符上运行一些函数。
使用用于读取UTF-8文件的FileStream和StreamReader,您如何知道是否满足上述条件?
我正在寻找答案,请使用C#.NET 4.0 System.io名称空间中已经存在的属性或方法。我认为使用流。位置(BufferedStream.Position)属性是找出读取器的文件(即在哪个字符)中找到位置的明显方法,但是在尝试以'0'
中某些字符开始的UTF-8文件时对于'9'
(48至57),带有reader.read()的循环读取该char和 stream.Position = 43
。我不知道为什么所有积分值中的43个是读取第一个字符后的stream.Position
的值,或者43的含义。
update :随着循环的迭代和读取器读取更多字符,stream.Position
值仍保持在43。我不知道该位置属性是有用的。
bool first = true;
while((i = reader.Read()) > -1)
{
if (first)
{
first = false;
// Do first character things
}
请注意,第一个字符的概念很复杂:如果第一个字形是 è
,该概念会在文件中占两个字节吗?流位置至少为2: - )
通常,您可以检查StreamReader.BaseStream
的Position
是什么,但是Position
几乎没有用,因为可能存在多个级别的缓存,或仅仅是因为用于读取单个char
,StreamReader
可能会消耗1-4字节(à
是一个字节,而某些Unicode字符是长4个字节)...然后UTF8文件可以具有BOM(初始标题长3个字节)。通常也从StreamReader
跳过。
仍然可以,如果需要的话,您可以将整个StreamReader
类群体划分,覆盖所有Read*
,并保留内部标志SomethingHasBeenRead
。这并不困难(StreamReader
中的所有内容都是virtual
)...