我是一个 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 —文档末尾
1
MaxTan 2018-12-27 09:42:17 +08:00
才一千行,直接 ReadAllLines()
|
2
NBGGA OP @MaxTan 现在测试的文件是 1000 行,之前项目经理扔给我的时候只给了我一个 10 行的测试文件,具体环境文件有多大我也不知道,不过你这个方法可以试一下,感谢🙏
|
3
celeron533 2018-12-27 10:15:51 +08:00
我也挺好奇是什么操作让读取“指针”重新回到头?
|
4
luojianxhlxt 2018-12-27 10:49:35 +08:00
是不是多线程了。。。
|
5
jingyulong 2018-12-27 11:03:52 +08:00
把你的代码缩紧了一下,双重循环?
<script src="https://gist.github.com/jingyulong/397fbc31828d4ab4aad48614dfd26084.js"></script> |
6
yejinmo 2018-12-27 11:09:02 +08:00
1. 你这个循环有问题吧
2. 文本数量不多直接 System.IO.File.ReadAllText() 全都读进来 |
7
jingyulong 2018-12-27 11:09:26 +08:00
@Livid Gist 报错,显示不了 Gist 代码,能帮忙看看什么问题吗? Uncaught ReferenceError: lazyGist is not defined
|
8
NBGGA OP @luojianxhlxt 程序里除了上文调用了 Thread.sleep 没有其他和线程有关的操作
|
9
NBGGA OP @yejinmo 程序读到一些特定的格式时需要在其他文件中写数据,内循环控制写的段落,外循环控制读完整个文件,除了指针第一次进入循环体的时候会跳回文件开头,其他次数的循环都能正常执行
|
10
NBGGA OP @jingyulong 是双重循环,因为要在别的文件里写东西,内循环根据读到的内容的格式控制段落,外循环保证读完整个文件
|
11
jingyulong 2018-12-27 13:16:36 +08:00
感觉循环有问题,还有跟数据有关。
感觉一层循环可以做出来,一层循环没有问题,再用第二层。 |
12
coder001 2018-12-27 19:59:49 +08:00
感觉是文件被重新打开了
|
13
NBGGA OP @jingyulong 后来我修改了 streamreader 的缓冲区大小后发现实际上 readline 读了两遍文件,第一遍是缓冲区大小不够所以才只读了前几行,但是 readline 读完不就应该结束了吗,为何还会读第二遍呢
|
15
jingyulong 2018-12-28 07:41:55 +08:00 via iPhone
@NBGGA 那你应该是用了两种读取文件的方法,缓冲区的大小可以任意,一般最佳实践是 4096,读完缓冲区的大小,他会自动的读下一个 Stream 地址,ReadLine 专门用来打开文件读字符串。不知到另外一种你用的什么方法。
|
16
NBGGA OP @jingyulong 自始至终只用了 readline 方法,前面代码读文件后将指针复位,后面程序接着上面的文件读,流没有断,也没有进行多次打开文件的操作;我在网上搜到有网友因为缓存没设置导致文件没读完就结束了,所以觉得这里可能有坑,今天在公司有别的事所以没去改 bug,明天我改好了再来告诉你们原因吧😂
|
17
lymi2771 2019-01-24 21:12:53 +08:00 via iPhone
sr seek 之后要 clear 缓存内容 有方法可以掉 你用没用 seek ?
|