为什么这个while循环省略了第一次迭代?

时间:2016-10-04 06:53:20

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

我是编码的新手,我一直绞尽脑汁,但实际上无法向我解释:

我有一个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循环中?

提前致谢!

3 个答案:

答案 0 :(得分:4)

让我们看看你在做什么:

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

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

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

您将文件的剩余部分读到最后。它不会回过头来阅读您已阅读并跳过的第一行。这就是为什么它没有按预期工作的原因。

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

而且,while循环是无意义的,因为无论如何你都要读到文件的末尾。永远不会有第二次迭代!

答案 1 :(得分:3)

此时您正在阅读第一行

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

你可以这样做

while(!file.EndOfStream)

答案 2 :(得分:2)

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

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

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