C# StreamReader 类的 ReadLine 方法重复读行问题

2018-12-27 09:38:44 +08:00
 NBGGA

我是一个 noobJava 开发人员,现在有一个遗留的 C#项目需要我去改错,代码逻辑没问题,能够正常运行,但是具体程序运行结果不如人意,感请各位 C#大佬指点。 程序通过 while((line=sr.ReadLine())!=null)按行读取文件,期望的顺序是 1 — 2 — 3 — 4 — 5 — 6,而程序读行是先读了前 19 行,然后从第 1 行重新开始读到文档最后一行。请问这里面是有什么坑吗?哪些地方可能出现问题? 读取文件部分代码结构: while(ReadLine!=null){ if(...){ ...//1#读取并在别的文件写入 while(ReadLine!=null){ if(...){ ...//2#读取并在别的地方写入 }}}} //文件有接近一千行,1#的地方顺序 1 — 2 — 3 — 1 — 2 — 3 — 4 — 5 —文档最后一行,2#的地方顺序正常 1 —文档末尾

9156 次点击
所在节点    C#
17 条回复
MaxTan
2018-12-27 09:42:17 +08:00
才一千行,直接 ReadAllLines()
NBGGA
2018-12-27 09:57:37 +08:00
@MaxTan 现在测试的文件是 1000 行,之前项目经理扔给我的时候只给了我一个 10 行的测试文件,具体环境文件有多大我也不知道,不过你这个方法可以试一下,感谢🙏
celeron533
2018-12-27 10:15:51 +08:00
我也挺好奇是什么操作让读取“指针”重新回到头?
luojianxhlxt
2018-12-27 10:49:35 +08:00
是不是多线程了。。。
jingyulong
2018-12-27 11:03:52 +08:00
把你的代码缩紧了一下,双重循环?
<script src="https://gist.github.com/jingyulong/397fbc31828d4ab4aad48614dfd26084.js"></script>
yejinmo
2018-12-27 11:09:02 +08:00
1. 你这个循环有问题吧
2. 文本数量不多直接 System.IO.File.ReadAllText() 全都读进来
jingyulong
2018-12-27 11:09:26 +08:00
@Livid Gist 报错,显示不了 Gist 代码,能帮忙看看什么问题吗? Uncaught ReferenceError: lazyGist is not defined
NBGGA
2018-12-27 11:31:57 +08:00
@luojianxhlxt 程序里除了上文调用了 Thread.sleep 没有其他和线程有关的操作
NBGGA
2018-12-27 11:38:04 +08:00
@yejinmo 程序读到一些特定的格式时需要在其他文件中写数据,内循环控制写的段落,外循环控制读完整个文件,除了指针第一次进入循环体的时候会跳回文件开头,其他次数的循环都能正常执行
NBGGA
2018-12-27 11:46:15 +08:00
@jingyulong 是双重循环,因为要在别的文件里写东西,内循环根据读到的内容的格式控制段落,外循环保证读完整个文件
jingyulong
2018-12-27 13:16:36 +08:00
感觉循环有问题,还有跟数据有关。

感觉一层循环可以做出来,一层循环没有问题,再用第二层。
coder001
2018-12-27 19:59:49 +08:00
感觉是文件被重新打开了
NBGGA
2018-12-28 00:15:50 +08:00
@jingyulong 后来我修改了 streamreader 的缓冲区大小后发现实际上 readline 读了两遍文件,第一遍是缓冲区大小不够所以才只读了前几行,但是 readline 读完不就应该结束了吗,为何还会读第二遍呢
NBGGA
2018-12-28 00:16:43 +08:00
@coder001 只打开了一次,前面是有进行移动指针操作
jingyulong
2018-12-28 07:41:55 +08:00
@NBGGA 那你应该是用了两种读取文件的方法,缓冲区的大小可以任意,一般最佳实践是 4096,读完缓冲区的大小,他会自动的读下一个 Stream 地址,ReadLine 专门用来打开文件读字符串。不知到另外一种你用的什么方法。
NBGGA
2018-12-28 19:40:49 +08:00
@jingyulong 自始至终只用了 readline 方法,前面代码读文件后将指针复位,后面程序接着上面的文件读,流没有断,也没有进行多次打开文件的操作;我在网上搜到有网友因为缓存没设置导致文件没读完就结束了,所以觉得这里可能有坑,今天在公司有别的事所以没去改 bug,明天我改好了再来告诉你们原因吧😂
lymi2771
2019-01-24 21:12:53 +08:00
sr seek 之后要 clear 缓存内容 有方法可以掉 你用没用 seek ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/521389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX