2013-09-06 6 views
-1

Я читаю текстовый файл, который имеет некоторый формат. Я пропускаю первые две строки, а затем читаю имя, второе имя, а затем создаю список firstname, secondname. Все работает, но когда последняя строка пуста, моя программа перестает работать и дает ошибку. Как избежать whiltespace так, что моя программа не остановить мой код:C# чтение из текстового файла

public void Read(string filename, List<Person> person) 
{ 
    using (StreamReader sr = new StreamReader(filename)) 
    { 
     sr.ReadLine(); 
     sr.ReadLine(); 
     while (!sr.EndOfStream) 
     { 
      FirstName= sr.EndOfStream ? string.Empty : sr.ReadLine(); 
      LastName= sr.EndOfStream ? string.Empty : sr.ReadLine(); 
      person.Add(new Person(FirstName, LastName)); 
     } 
    } 
} 

Формат файла

Students Data 
Description 
FirstName 
LastName 
FirstName 
LastName 
FirstName 
LastName 
FirstName 
LastName 
+6

Уход объяснить, что такое ошибка? – Arran

+1

Вызывает ли он 'sr.ReadLine()' дважды? –

+1

Если вы можете, подумайте об изменении формата файла. Отдельные разделители должны использоваться между полями (имя, фамилия) и записи (пара имен - человек). CSV идеально подходит для этого приложения. http://en.wikipedia.org/wiki/Comma-separated_values ​​ – Gusdor

ответ

2

Что происходит не так, что sr.ReadLine() будет выполняться независимо от того, имеет ли документ следующего линия или нет, так что он может вернуть нуль (если вы бежите из линий) Просто проверьте sr.ReadLine() возвращает null

public void Read(string filename, List<Person> person) 
{ 
    using (StreamReader sr = new StreamReader(filename)) 
    { 
     sr.ReadLine(); 
     sr.ReadLine(); 
     while (!sr.EndOfStream) 
     { 
      String FirstName = sr.ReadLine() ?? "-not defined-"; 
      String LastName = sr.ReadLine() ?? "-not defined-"; 

      person.Add(new Person(FirstName, LastName)); 
     } 
    } 
} 
+1

Не те ли встроенные ifs достаточно, чтобы предотвратить ReadLine, когда достигнут конец потока? –

+0

Да, просто упростил ответ. –

+0

Op столкнулся с проблемой из-за того, как он делал свои чеки с помощью 'sr.EndOfStream', он проверял бы, было ли в потоке больше * байтов *, а не в том, было ли еще больше * строк * впереди в потоке. –

1

Вы можете создать адаптер для класса StreamReader, что-то вроде этого

public class NoBlankStreamReader : StreamReader 
{ 
    public NoBlankStreamReader(FileStream fs) : base(fs) { } 


    private bool IsBlank(string inString) 
    { 
     if (!string.IsNullOrEmpty(inString)) inString = inString.Trim(); 
     return string.IsNullOrEmpty(inString); 
    } 


    public override string ReadLine() 
    { 
     string result= base.ReadLine(); 
     while (result!=null && IsBlank(result)) 
      result = base.ReadLine(); 
     return result; 
    } 
} 

затем использовать как этот:

using (FileStream fs=File.OpenRead(@"test.txt")) 
using (TextReader reader = new NoBlankStreamReader(fs)) 
{ 
    while (reader.Peek() > -1) 
     Console.WriteLine(reader.ReadLine()); 
} 

или вы можете увидеть пост:

how to remove empty line when reading text file using C#

+0

Неплохой путь! –

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