加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c#FileStream读取StreamReader EndOfStream存在问题

发布时间:2020-12-15 23:49:50 所属栏目:百科 来源:网络整理
导读:正如标题所说,我发现了一个问题.小故事第一: 我们有file.txt看起来像这样: aaaabbccccdddeeeefffffff 有许多方法可以逐行阅读本文,其中一种方法是: StreamReader sr = new StreamReader("file.txt");while(!sr.EndOfStream){ string s = sr.ReadLine();}s
正如标题所说,我发现了一个问题.小故事第一:
我们有file.txt看起来像这样:

aaaabb
ccccddd
eeeefffffff

有许多方法可以逐行阅读本文,其中一种方法是:

StreamReader sr = new StreamReader("file.txt");
while(!sr.EndOfStream)
{
    string s = sr.ReadLine();
}
sr.Close();

作品.获得每一行.
现在我需要前4个字母作为字节,其余的作为字符串.在查看事物并尝试一点后,我发现最简单的方法是:

FileStream fs = new FileStream("file.txt",FileMode.Open);
StreamReader sr = new StreamReader(fs);
byte[] arr = new byte[4];
fs.Read(arr,4);
string s = sr.ReadLine();
sr.Close();
fs.Close();

作品. arr包含前4个字母作为字节,其余部分保存在s中.这只是一行.如果我们添加while:

FileStream fs = new FileStream("file.txt",FileMode.Open);
StreamReader sr = new StreamReader(fs);
while(!sr.EndOfStream)
{
    byte[] arr = new byte[4];
    fs.Read(arr,4);
    string s = sr.ReadLine();
} 
sr.Close();
fs.Close();

现在有一个问题.现在arr没有得到任何东西,并且s读取整行,包括前4个字母.更奇怪的是,如果我使用while(true)(并且我假设其他任何不是示例)而不是按预期工作,则4个字符作为字节,其余为字符串,这对于每一行都是相同的.

问题是我错过了什么?为什么会这样?我该如何解决这个问题?或者这可能是一个错误?

解决方法

这里的问题是简单的缓冲.当您将StreamReader附加到FileStream时,它最终会从文件中占用一个块,从而推进FileStream的当前位置.使用您的示例文件和默认缓冲区大小,一旦StreamReader附加自身,它基本上将整个文件消耗到缓冲区中,使FileStream保持其EOF.然后,当您尝试直接通过fs引用从FileStream读取4个字节时,没有什么可以消耗的.以下ReadLine适用于您的sr引用,因为它是从缓冲文件内容中读取的.

以下是对正在发生的事情的逐步细分:

> fs打开文件并位于位置0.
> sr包装fs并且对EndOfStream的调用最终消耗(在这种情况下)27个字节到其内部缓冲区.此时,fs Position现在位于EOF.
>您尝试直接读取fs,但它在EOF处没有更多字节.
> sr.ReadLine从步骤#2中构建的缓冲区中读取,一切正常.

要修复特定的错误情况,可以将字节数组更改为char数组,然后使用sr.Read.即

char[] arr = new char[4];
sr.Read(arr,4);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读