【问题标题】:Why is this while loop omitting the first iteration?为什么这个while循环省略了第一次迭代?
【发布时间】:2017-02-12 05:50:10
【问题描述】:

我是编码新手,我一直在为此绞尽脑汁,但真的无法向自己解释:

我有一个 csv 文件,其内容如下:

line1_value1, line1_value2, line1_value3
line2_value1, line2_value2, line2_value3
line3 value1, line3_value2, line3_value3

出于测试目的,我尝试使用以下代码打印出值:

static void Main(string[] args)
{
    Program test = new Program();
    test.printFile();
}

System.IO.StreamReader file = new System.IO.StreamReader(@"C:\some_file.csv");

public void printFile()
{
    string line;

    while ((line = file.ReadLine()) != null)
    {
        string[] substrings = file.ReadToEnd().Split(',');

        foreach (var substring in substrings) {
            Console.WriteLine(substring);        
        }

        Console.ReadLine();
    }        
}

但它省略了第一行并打印:

line2_value1
line2_value2
line2_value3
line3 value1
line3_value2
line3_value3

如果我在 do while 循环中执行此操作,它会按预期工作:

public void printFile()
{
    string line;

    do
    {
        string[] substrings = file.ReadToEnd().Split(',');                

        foreach (var substring in substrings)
        {
            Console.WriteLine(substring);
        }
    }

    while ((line = file.ReadLine()) != null);

    Console.ReadLine();
}

打印出来:

line1_value1
line1_value2
line1_value3    
line2_value1
line2_value2
line2_value3
line3 value1
line3_value2
line3_value3

为什么第一行没有出现在 while 循环中?

提前致谢!

【问题讨论】:

  • 两个 sn-ps 都无缘无故地多次读取整个文件。只需使用ReadToEnd() 一次或更好,ReadAllLines()。你只是一遍又一遍地阅读同一个文件
  • 我希望它可以按行读取并以逗号分隔。所以我必须分两次循环,不是吗?
  • 它适用于:string[] substrings = line.Split(',');
  • ReadToEnd 读取整个文件,而不仅仅是一行。如果你想读一行,你需要ReadLine。此外,您可以简单地使用ReadAllLines 将所有行读入一个数组或使用ReadLines 返回一个IEnumerable<string>,它将一次返回一行
  • 但是对于我正在尝试编写的程序,我需要单独读取每一行(至少我认为我需要这个)。微软建议这样做:msdn.microsoft.com/en-gb/library/94223t4d.aspx.

标签: c# loops while-loop do-while


【解决方案1】:

让我们看看你在做什么:

while ((line = file.ReadLine()) != null)

所以你从文件中读取了第一行。接下来,你这样做:

string[] substrings = file.ReadToEnd().Split(',');

您阅读了文件的其余部分,直到最后。它不会返回阅读您已阅读和跳过的第一行。这就是它没有按预期工作的原因。

我不确定正确的行为应该是什么,因为您的阅读似乎不是基于行的(那么为什么首先使用ReadLine?)。您可以阅读自己,直到遇到第一个 , 并在此基础上进一步处理。或者读取整个文件,如果它不像您在第二个语句中所做的那样太大。

此外,while 循环是无稽之谈,因为无论如何您都一直读到文件末尾。永远不会有第二次迭代!

【讨论】:

  • 谢谢!实际上,多亏了您的帮助,我才弄清楚了: string[] substrings = line.Split(',');我(想我)需要为我正在尝试编写的一个小程序逐行读取它。
【解决方案2】:

此时你正在阅读第一行

while ((line = file.ReadLine()) != null)

您可以改为这样做

while(!file.EndOfStream)

【讨论】:

  • 好的。那么这有什么问题呢?
  • @PatrickHofman 然后 OP 读取并拆分文件的 rest。实际上,OP 丢弃了第一行'。没有循环的单个 ReadToEndReadAllLines 就足够了
  • 不,真的是@PanagiotisKanavos 但是为什么答案中没有呢?
  • 顺便说一句,使用while(!file.EndOfStream) 毫无意义,因为永远不会有第二次迭代。
  • 我没有说这很糟糕我的朋友,@pumuckl 问了一个问题,我回答了。
【解决方案3】:

这是因为您正在将文件的第一行读入变量行并且从不使用输出。

while ((line = file.ReadLine()) != null)

然后你剩下的文件结束(但没有第一行)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2019-08-29
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多