【问题标题】:StreamReader, C#, peekStreamReader,C#,偷看
【发布时间】:2009-11-15 14:02:47
【问题描述】:

我有一个 StreamReader,它会不时检查它是否有更多内容可以从简单的文本文件中读取。它使用 peek 属性。问题是,当我使用 peek 时,位置会改变,尽管不应该。

FileStream m_fsReader = new FileStream(
                        m_strDataFileName,
                        FileMode.OpenOrCreate,
                        FileAccess.Read,
                        FileShare.ReadWrite                        );

StreamReader m_SR = new StreamReader(m_fsReader);

Console.WriteLine("IfCanRead SR Position " + m_fsReader.Position +
     " and Length " + m_fsReader.Length);

if (m_SR.Peek() == -1) {
       Console.WriteLine("IfCanRead false 2 SR Position " + 
             m_fsReader.Position  + " and Length " + m_fsReader.Length);

       return false;
}
else {
       Console.WriteLine("IfCanRead true 2 SR Position " + 
           m_fsReader.Position + " and Length " + m_fsReader.Length);

       return true;
}  

【问题讨论】:

  • 发布您的相关代码,因为 Peek 消耗任何字节。这就是 Peek 的重点。
  • 我假设您知道 File.ReadAllBytes 和其他类似方法,但它们不能在您的特定程序中使用...

标签: c# streamreader .net peek


【解决方案1】:

documentation 表示 StreamReader 的位置没有改变,但您正在检查底层流的当前位置,而不是阅读器本身的位置。我认为它不能保证底层流的位置保持不变。事实上,我怀疑它只是简单地读取它并在内部缓冲以将读者的光标保持在前一个位置。这意味着它不能保证底层流的位置不变。

Peek 不会更改 StreamReader 对象的当前位置。如果当前没有更多可用字符,则返回值为 -1。

【讨论】:

  • 不,我正在检查 StreamReader 处理程序。
  • 您的代码显示您正在打印流的位置,而不是流读取器。我知道您在阅读器上调用 Peek,但您似乎认为它将流留在相同的位置,但文档只说它使阅读器的位置保持不变。我将进行编辑,以便您删除错误的反对票。
  • +1。您精心制作的答案不值得负分。
  • +1 - 很遗憾你投了反对票,而实际上你的答案很划算
  • @Roman -- 否决不正确的答案是完全合理的,我可以理解您可能认为我的答案不适用。这就是为什么我评论和编辑让你有机会撤销你的投票。没有难过的感觉。
【解决方案2】:

我自己测试过。底层 FileStream 的位置发生了变化,但关键是,这并不意味着 StreamReader 实际上有 CONSUMED 任何字节。所以没有问题。

【讨论】:

  • 我不知道为什么你会拒绝那些试图帮助你的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 2023-02-23
  • 2011-01-31
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
相关资源
最近更新 更多