2014-08-28 2 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)' вместо того, чтобы открывать поток, а затем читать строки? Это даст вам массив, который вы можете перебрать. –

+3

@ siva.k, когда файл большой, чтение всего текста внутри памяти не может быть хорошим тигом. Я думаю, что подход OP хорош, так как его бизнес-логика позволяет обрабатывать файл по очереди. – 2014-08-28 19:41:01

+0

@pwas Ах, да, хорошая точка. –

ответ

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 работал и на меня. –

0

Вы пробовали использовать метод Peek()?

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

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

Я пробовал это, и, похоже, он работает точно так же, поскольку моя проблема заключается в том, что операции с последней строкой игнорируются. –

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... 
    } 
} 

его не чистейший кодом, но я никогда не был совершенным.

Смежные вопросы