【问题标题】:Moving the file cursor up lines?将文件光标向上移动几行?
【发布时间】:2012-01-07 12:15:58
【问题描述】:

我已经疯狂地用谷歌搜索了这个,我似乎根本找不到任何关于这种特殊类型问题的参考。

我有一个带有文件的StreamReader 对象,我想多次读取文件中的特定行数,但是,似乎没有任何方法可以移动文件光标到文件中的某些位置。

(没有代码,因为我不知道如何编写这样的东西)

【问题讨论】:

  • 您需要某个位置(如 17)还是您的意思是某行(如第 3 行)?
  • 某一行,但该行总是相同的字符(包含'{'字符的单行)
  • 没有办法定位到确切的行...只能定位到文件中的绝对或相对字节...如果您需要定位到一行,您需要自己实现 - 要么通过将文件加载到字符串[] 或通过扫描文件并构建包含每行绝对位置的索引...

标签: c# file-io streamreader


【解决方案1】:

你应该可以使用

myStreamReader.BaseStream.Position = desiredPosition;
myStreamReader.DiscardBufferedData();

将流移动到特定位置。

编辑:下一个问题是如何找到desiredPosition。由于您希望将位置 向后 移动到文件中,而不是 向前,因此您已经在某个点读取了每个位置。您需要在阅读行时跟踪您在流中的位置,并将位置存储在List<int> positions 中。最初,列表应在位置零包含0。在处理行时,将行的长度加上换行符的大小添加到列表中。当你想回到k行时,positions[k]应该有你需要的位置。

例如,如果您的文件包含以下行,则您的编码使用每个字母一个字符,并且文件中的行分隔符是 Windows 样式的 \r\n

Quick
brown fox
jumps over lazy
dog

那么您的 positions 列表应该有 {0, 7, 17, 34} 请注意,我在每行添加了 2 作为分隔符。

附:这是一个丑陋的解决方案,不是吗?如果有什么安慰的话,你不是第一个遇到它的人。 Here is a somewhat obscene rant 来自 2007 年想解决类似问题的人。

【讨论】:

    【解决方案2】:

    Stream.Seek() (MSDN docs) 是您需要的,但这是文件中的绝对位置,没有换行的概念。

    我更喜欢将这些行读入集合内存,然后在加载接下来的几行之前尽可能频繁地迭代内存中的集合。事实上,除非你在谈论数据的傻笑字节,否则只需阅读List<string> 中的 string 对象中的所有行,并用它做任何你需要的事情。

    【讨论】:

      【解决方案3】:

      没有办法定位到确切的行...只能定位到文件中的绝对或相对字节...如果您需要定位到一行,您需要自己实现 - 要么通过将文件加载到string[](不推荐用于大文件!)或通过扫描文件并构建包含每行绝对位置的索引,以便您以后可以将该索引用于Seek 到所需的行...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多