【问题标题】:Reading every single line from txt file C#从 txt 文件 C# 中读取每一行
【发布时间】:2016-12-14 19:12:25
【问题描述】:

我想读取每一行格式的 txt 文件。而不是每一行,我得到每隔一行。问题是我为什么以及如何做一些事情。 列表.txt: 60001 60002 60003 60004 ..单行中的每个数字等100行

        StreamReader podz = new StreamReader(@"D:\list.txt");

        string pd="";
        int count=0;

        while ((pd = podz.ReadLine()) != null) 
        {
            Console.WriteLine("\n number: {0}", podz.ReadLine());
            count++;

        }
        Console.WriteLine("\n c {0}", count);
        Console.ReadLine();

【问题讨论】:

  • 使用 pd 而不是 readline 进入 pd,然后 readline。您的代码当前 readlines 到 pd,忽略它和 readlines - 每次循环迭代 2 个 readlines
  • 为什么不直接使用File.ReadAllLines(string path)MSDN。然后你可以只做foreach (string line in lines),这样你甚至不需要int count,因为你有lines.Count

标签: c# streamreader readline


【解决方案1】:

因为您每次循环迭代读取两行:

while ((pd = podz.ReadLine()) != null) // here
{
    Console.WriteLine("\n number: {0}", podz.ReadLine()); // and here
    count++;
}

相反,只需首先读取该行,然后使用您在其中存储该行的 pd 变量:

while ((pd = podz.ReadLine()) != null)
{
    Console.WriteLine("\n number: {0}", pd);
    count++;
}

【讨论】:

    【解决方案2】:

    我建议使用 File 而不是 StreamsReaders

       var lines = File
         .ReadLines(@"D:\list.txt");
    
       int count = 0;
    
       foreach (var line in lines) {
         Console.WriteLine("\n number: {0}", line);
         count++;
       }
    
       Console.WriteLine("\n c {0}", count);
       Console.ReadLine();
    

    【讨论】:

    • 也许这是个愚蠢的问题,但这是 LINQ 的哪一部分? File.ReadLines 不需要 LINQ,是吗?另外我想你知道这一点,但保留int count 并在循环中增加它没有意义,因为你可以使用lines.Length
    • @sab669:你说的很对,不是Linq,最多是IEnumerable<String>;在ReadAllLines 的情况下,在循环内增加count 是没有意义的(请注意All),但ReadLines 只返回IEnumerable<String>。如果文件大小未知,ReadLines 是比ReadAllLines 更安全的选择
    【解决方案3】:

    您的代码有一些问题:

    • 你读错了行(每次迭代调用ReadLine两次)

    • 您没有关闭Stream

    • 如果文件正被另一个进程使用(即写入文件的进程),您可能会遇到一些错误

    StreamReader 类在文件非常大时很有用,如果您正在处理一个小文件,您可以简单地调用System.IO.File.ReadAllLines("FileName")

    如果文件比较大,按照这种方式处理

    public static List<String> ReadAllLines(String fileName)
    {
        using(System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read))
        {
            using(System.IO.StreamReader sr = new System.IO.StreamReader(fs))
            {
                List<String> lines = new List<String>();
                while (!sr.EndOfStream)
                {
                    lines.Add(sr.ReadLine());
                }
                return lines;
            }
        }
    

    【讨论】:

    • 将其更改为 IEnumerable&lt;string&gt; 而不是 lines.Add 使用 yield return sr.ReadLine();
    • 您可以将文件名传递给StreamReader,而不是手动打开FileStream
    • @MatthewWhited:这会导致延迟执行,我认为用户可能对此有疑问。 FileStream 允许文件仍然可以访问,即使它正在被另一个进程使用。
    • new StreamReader(path : string) 创建一个具有相同参数的FileStream。所以是的,您将保持文件打开,但您也将使用更少的内存,并且如果您提前退出,则只会读取尽可能多的文件。
    • Stream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost); 特别是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多