我想知道是否有办法从下到上读取文本文件而没有任何性能损失,readLine,movenext方法,但反过来,在.net中是否可以这样做?
为了让事情变得更有趣,文本文件中有大约10万行,所以我不能用readall作弊,反过来......
更多细节:我有一组传入的字符串值,前缀为可以排序的int ID。不幸的是,我以错误的顺序获得这些ID。主要问题是字符串值的绝对数量,解决方案中没有RDBMS。所以我真的需要一种方法来存储字符串值,然后在处理过程中反转存储的顺序。文本文件浮现在脑海中,因为我目前还没有更好的解决方案。
提前致谢。
答案 0 :(得分:1)
为什么不使用StreamReader类的ReadToEnd()
方法,然后向后工作......
不可否认它不是很漂亮但它有效,我使用字节数组创建MemoryStream
实例,并使用指针hocus-pocus对StreamReader
实例使用,以后向方式读取数据
unsafe { byte[] b = System.Text.ASCIIEncoding.ASCII.GetBytes("Hello World! Foo wuz ere and so wuz bar"); using (MemoryStream mStream = new MemoryStream(b)) { string readStr; using (StreamReader sr = new StreamReader(mStream)) { readStr = sr.ReadToEnd(); } Console.WriteLine(readStr); fixed (char* beg = readStr) { char* p = beg + readStr.Length; while (p-- != beg) { Console.Write(*p); } } } }
希望这有帮助, 最好的祝福, 汤姆。
答案 1 :(得分:0)
好吧,如果你愿意深入潜水,你可能会使用二进制阅读器并自己阅读......
你必须反过来找出行结尾,并弄清楚如何确保你有正确的编码。
我说的相当令人生畏。
答案 2 :(得分:0)
只是一般答案。如果有某种peek()
方法,您可以将文件指针设置为filesize
(或filesize - 1
?),然后递减指针直到达到0.可能会有一些类在.NET中抽象出来。当然,您必须定义某种缓冲区大小(基本上定义您正在读取的文件的“块”的大小)。在这种情况下,上面的filesize - 1
可能会变为filesize - bufferSize
,您也会将文件指针递增bufferSize
。
答案 3 :(得分:0)
我认为你可以这样做可以使用PInvoke通过WINAPI来做到这一点。您需要创建一个内存映射文件,但只映射文件的末尾然后向上。
答案 4 :(得分:0)
因此,您以错误的顺序获取值,但希望以正确的顺序检索它们。也许是
Stack<T>
适合你。
http://msdn.microsoft.com/en-us/library/3278tedw.aspx
表示同一任意类型的实例的可变大小后进先出(LIFO)集合。
答案 5 :(得分:-1)
StreamReader类的ReadBlock方法允许您从特定位置读取。不确定性能,您可能只想将其读入数组,然后将其反转。