2014-08-28 783 views
2

我正在使用StreamReader读取文本文件中的行。对于每一行我都执行特定的操作。使用StreamReader读取文件的最后一行后执行操作

例子:

System.IO.StreamReader file = new System.IO.StreamReader(fileDirectory); //Open StreamReader 
while ((inFileString = file.ReadLine()) != null) 
{ 
    if(something) 
    { do stuff... } 
} 

最后一行被读取后,因为while循环内的代码变得不可访问时我的问题。这基本上就像我需要被允许在它自动退出后再次通过while循环。如何在从文件读取的最后一行执行我的操作?

(我可以只复制操作的循环之外,但我想这将是低效的...)

+0

出于好奇,为什么不使用'File.ReadAllLines(fileDirectory)'而不是打开一个流然后读取这些行?这会给你一个你可以迭代的数组。 – 2014-08-28 19:39:20

+3

@ siva.k当文件很大时,读取内存中的所有文本并不是一件好事。我认为OP方法很好,因为他的业务逻辑允许逐行处理文件。 – 2014-08-28 19:41:01

+0

@pwas啊,是的,好点。 – 2014-08-28 19:42:52

回答

2

我觉得这样看起来可以接受。

using (StreamReader file = new StreamReader(@"D:\Downloads\testfile.txt")) 
{ 
    string str = ""; 
    while ((str = file.ReadLine()) != null || str == null) 
    { 
     if (str == null) 
     { 
      Console.WriteLine("Hey! We've already passed the EOF!"); 
      break; 
     } 

     Console.WriteLine(str); 
    } 
} 
+0

非常感谢。由于简单,我最终改变了我的答案。 @ CalvinSmith的回答也适用于我。 – 2014-08-28 20:13:18

0

您是否尝试过使用Peek()方法?

using (var strReader = new System.IO.StreamReader()) 
{ 
    while (strReader.Peek() > -1) 
    { 
     var line = strReader.ReadLine(); 

     // Do Something 
    } 
    strReader.Close(); 
} 
+0

我试过了,它看起来工作完全一样,我的问题是最后一行上的操作被忽略。 – 2014-08-28 19:48:29

1

也许注意到了最佳的解决方案,但...

int TotalLines(string filePath) 
{ 
    using (StreamReader r = new StreamReader(filePath)) 
    { 
     int i = 0; 
     while (r.ReadLine() != null) 
     { 
      i++; 
     } 

     return i; 
    } 
} 

//Open StreamReader 
System.IO.StreamReader file = new System.IO.StreamReader(fileDirectory); 

for (int q = 0; q <= TotalLines + 1; i++) 
{ 
    file.ReadLine(); 

    if (q == int + 1) 
    { 
     //do stuff... 
    } 
} 

它不是最干净的代码,但我从来没有完美的。

相关问题