V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NBGGA
V2EX  ›  C#

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

  •  
  •   NBGGA · 2018-12-27 09:38:44 +08:00 via Android · 8893 次点击
    这是一个创建于 1918 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我是一个 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 —文档末尾

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

    感觉一层循环可以做出来,一层循环没有问题,再用第二层。
    coder001
        12
    coder001  
       2018-12-27 19:59:49 +08:00
    感觉是文件被重新打开了
    NBGGA
        13
    NBGGA  
    OP
       2018-12-28 00:15:50 +08:00 via Android
    @jingyulong 后来我修改了 streamreader 的缓冲区大小后发现实际上 readline 读了两遍文件,第一遍是缓冲区大小不够所以才只读了前几行,但是 readline 读完不就应该结束了吗,为何还会读第二遍呢
    NBGGA
        14
    NBGGA  
    OP
       2018-12-28 00:16:43 +08:00 via Android
    @coder001 只打开了一次,前面是有进行移动指针操作
    jingyulong
        15
    jingyulong  
       2018-12-28 07:41:55 +08:00 via iPhone
    @NBGGA 那你应该是用了两种读取文件的方法,缓冲区的大小可以任意,一般最佳实践是 4096,读完缓冲区的大小,他会自动的读下一个 Stream 地址,ReadLine 专门用来打开文件读字符串。不知到另外一种你用的什么方法。
    NBGGA
        16
    NBGGA  
    OP
       2018-12-28 19:40:49 +08:00 via Android
    @jingyulong 自始至终只用了 readline 方法,前面代码读文件后将指针复位,后面程序接着上面的文件读,流没有断,也没有进行多次打开文件的操作;我在网上搜到有网友因为缓存没设置导致文件没读完就结束了,所以觉得这里可能有坑,今天在公司有别的事所以没去改 bug,明天我改好了再来告诉你们原因吧😂
    lymi2771
        17
    lymi2771  
       2019-01-24 21:12:53 +08:00 via iPhone
    sr seek 之后要 clear 缓存内容 有方法可以掉 你用没用 seek ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2681 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:46 · PVG 23:46 · LAX 08:46 · JFK 11:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.