如何使用FileStream和StreamReader读取在UTF-8文件中启动char的条件



在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.BaseStreamPosition是什么,但是Position几乎没有用,因为可能存在多个级别的缓存,或仅仅是因为用于读取单个charStreamReader可能会消耗1-4字节(à是一个字节,而某些Unicode字符是长4个字节)...然后UTF8文件可以具有BOM(初始标题长3个字节)。通常也从StreamReader跳过。

仍然可以,如果需要的话,您可以将整个StreamReader类群体划分,覆盖所有Read*,并保留内部标志SomethingHasBeenRead。这并不困难(StreamReader中的所有内容都是virtual)...

相关内容

  • 没有找到相关文章