Проблемы с использованием StreamReader.EndOfStream?
Так что я делаю проект, где я читаю в файле конфигурации. Конфигурационный файл - это просто список строк, таких как "D 1 1", "C 2 2" и т. Д. Сейчас я никогда не делал чтения / записи в C#, поэтому я искал его в Интернете, ожидая найти какую-нибудь версию C/C++ .eof(). Я не мог найти один.
Так что у меня есть...
TextReader tr = new StreamReader("/mypath");
Из всех примеров в Интернете о том, как я обнаружил чтение до конца файла, два примера, которые продолжались, были
while ((line = tr.ReadLine() != null)
или же
while (tr.Peek() >= 0)
Я заметил, что StreamReader имеет bool EndOfStream, но никто не предлагал его, что привело меня к мысли, что с этим решением что-то не так. Я закончил тем, что попробовал это так...
while (!(tr as StreamReader).EndOfStream)
и, кажется, работает просто отлично.
Поэтому я думаю, что мой вопрос заключается в том, возникнут ли у меня проблемы с приведением TextReader в качестве StreamReader и проверкой EndOfStream?
5 ответов
Очевидным недостатком является то, что он делает ваш код StreamReader
конкретный. Учитывая, что вы можете легко написать код, используя просто TextReader
почему бы не сделать это? Таким образом, если вам нужно использовать StringReader
(или что-то подобное) для модульных тестов и т. д., никаких сложностей не будет.
Лично я всегда использую подход "прочитать строку, пока она не станет нулевой" - иногда с помощью метода расширения, чтобы я мог использовать
foreach (string line in reader.EnumerateLines())
{
}
EnumerateLines
будет тогда методом расширения на TextReader
используя блок итератора. (Это означает, что вы можете легко использовать его для LINQ и т. Д.)
Или вы могли бы использовать ReadAllLines
, чтобы упростить ваш код:
http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx
Таким образом, вы позволяете.NET позаботиться обо всем управлении EOF/EOL и сосредоточиться на своем контенте.
Нет, у вас не возникнет никаких проблем. Если вы посмотрите на реализацию EndToStream, вы обнаружите, что он просто проверяет, есть ли еще данные в буфере, и если нет, может ли он читать больше данных из базового потока:
public bool EndOfStream
{
get
{
if (this.stream == null)
{
__Error.ReaderClosed();
}
if (this.charPos < this.charLen)
{
return false;
}
int num = this.ReadBuffer();
return num == 0;
}
}
Конечно, приведение кода в ваш код делает его зависимым от того, что StreamReader является реальным типом вашего ридера, что не очень приятно с самого начала.
Ну, StreamReader - это специализация TextReader в том смысле, что StreamReader наследуется от TextReader. Так что не должно быть проблем.:)
var arpStream = ExecuteCommandLine(cmd, arg);
arpStream.ReadLine(); // Read entries
while (!arpStream.EndOfStream)
{
var line1 = arpStream.ReadLine().Trim();
// TeststandInt.SendLogPrint(line, true);
}
Может быть, прочитать все это в строку, а затем проанализировать его: StreamReader.ReadToEnd ()
using (StreamReader sr = new StreamReader(path))
{
//This allows you to do one Read operation.
string contents = sr.ReadToEnd());
}