2013-05-11 5 views
-1

Я достиг большого прогресса, но теперь у меня проблема с загрузкой файла. Вот класс с методом файлов загрузки снова:Ошибка загрузки файла

public class BunchOfDeliverables 
{ 
    private List<Person> myPersons; 
    private List<Deliverable> myDeliverables; 

    public BunchOfDeliverables() 
    { 
     this.myPersons = new List<Person>(); 
     this.myDeliverables = new List<Deliverable>(); 
    } 

    public List<Person> Persons { get { return this.myPersons; } } 
    public List<Deliverable> Deliverables { get { return this.myDeliverables; } } 

    public void LoadPersonsFromFile(String filename) 
    { 
     StreamReader sr = null; 
     try 
     { 
      sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read)); 
      String name, street, housenr, postalcode, city; 
      name = sr.ReadLine(); 
      while (name != null) 
      { 
       street = sr.ReadLine(); 
       housenr = sr.ReadLine(); 
       postalcode = sr.ReadLine(); 
       city = sr.ReadLine(); 
       this.myPersons.Add(new Person(name, street, Convert.ToInt32(housenr), postalcode, city)); 
       name = sr.ReadLine(); 
       name = sr.ReadLine(); //and again read a line, because of the delimiter (line with the stars) 
      } 
     } 
     catch (IOException) { } 
     finally 
     { 
      if (sr != null) sr.Close(); 
     } 
    } 

    public void LoadDeliverablesFromFile(String filename) 
    { 
     StreamReader sr = null; 
     try 
     { 
      sr = new StreamReader(new FileStream(filename, FileMode.Open, FileAccess.Read)); 
      String s; 
      s = sr.ReadLine(); 
      while (s != null) 
      { 
       String[] items = s.Split(); 
       this.myDeliverables.Add(new Deliverable(Convert.ToInt32(items[0]), Convert.ToInt32(items[1]), this.myPersons[Convert.ToInt32(items[2])])); 
       s = sr.ReadLine(); 
      } 
     } 
     catch (IOException) { } 
     finally 
     { 
      if (sr != null) sr.Close(); 
     } 
    } 


    public void AddPerson(Person p) 
    { 
     this.myPersons.Add(p); 
    } 


    public Deliverable FindDeliverable(int id) 
    { 
     foreach (Deliverable d in this.myDeliverables) 
     { 
      if (d.ID == id) 
      { 
       return d; 
      } 
     } 
     return null; 
    } 

    public void AddDeliverable(Deliverable d) 
    { 
     if (FindDeliverable(d.ID) == null) 
     { 
      myDeliverables.Add(d); 
     } 
     else 
     { 
      throw new Exception("Be aware: nothing is added!!!"); 
     } 

    } 

И здесь - в виде I`ve инициализируются их:

public partial class Form1 : Form 
{ 
    BunchOfDeliverables d; 
    public Form1() 
    { 
     InitializeComponent(); 
     d = new BunchOfDeliverables(); 
     d.LoadDeliverablesFromFile("../../data/deliverables.txt"); 
     d.LoadPersonsFromFile("../../data/persons.txt"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     listBox1.Items.Clear(); 
     foreach (Person per in d.Persons) 
     { 

      listBox1.Items.Add(per); 
     } 


    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 

    private void ViewDeliv_Click(object sender, EventArgs e) 
    { 
     listBox1.Items.Clear(); 
     foreach (Deliverable deliv in d.Deliverables) 
     { 

      listBox1.Items.Add(deliv); 
     } 
    } 

Теперь для лиц загрузки файлов он работает как шарм, ничто не пойдет не так, но как только я попытаюсь загрузить файл Deliverables, возникает следующая ошибка:

Индекс был за пределами допустимого диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс "на этой линии:

" this.myDeliverables.Add (новый Deliverable (Convert.ToInt32 (пункты [0]), Convert.ToInt32 (пункты [1]), this.myPersons [Преобразовать. ToInt32 (пункты [2])]));»

Вот как файл Deliverables структурирована небольшой пример (без пустых строк):

1 350 1 
2 700 5 
3 360 7 
4 360 6 

Любая помощь будет оценен по достоинству!

+3

Во-первых, вы предоставили * way * больше кода, чем это действительно актуально. Вы могли бы сократить это примерно до 10 строк кода, которые все еще показали бы проблему. Во-вторых, предположительно «элементы» не имеют трех элементов для строки, которая вызывает проблему. Какую диагностику вы провели? Вы перешли в отладчик? Добавлена ​​регистрация? –

+0

Я не проверил диагностику или не прошел через отладчик. Я изучаю компьютерную науку в университете в течение 1-го года, и мы до сих пор не сделали таких вещей, только действительно базовые вещи (этот код не мой, он был дан, и мне просто нужно добавить некоторые методы и прочее, но я пришел к выводу что у данного кода была ошибка, которую я написал выше). –

+0

«Вот как файл результатов структурирован с небольшим примером ** (без пустых строк): **« * hint: * Как вы думаете, что произойдет, если вы назовете «Разделить» пустую строку? – Tim

ответ

0

Эта ошибка означает, что массив items имеет короткие элементы. Таким образом, он имеет только 0, 1 или 2 элемента, а не 3.

Перенаправление вашего файла имеет пустую строку в конце, которая не содержит информации.

Попробуйте изменить свой цикл пока с:

while(!string.IsNullOrWhiteSpace(s)) 
    .... 

Вы также можете проверить первый, если количество элементов в массиве равно 3.

Если все это не поможет, поставить точку останова эта линия. Каждый раз, когда ваш код прерывается, проверьте значение s и items.

0

Этот код:

String[] items = s.Split(); 
this.myDeliverables.Add(new Deliverable(Convert.ToInt32(items[0]), Convert.ToInt32(items[1]), this.myPersons[Convert.ToInt32(items[2])])); 

при условии, что каждая строка в вашем входном файле имеет, по меньшей мере, три разделенных пробелами элементов.

Если строка содержит меньше предметов, вы получите эту ошибку. Это может означать ошибку в вашем входном файле, или это может означать, что в файле есть достоверные данные, которые не учитываются в вашем синтаксическом анализе.

Чтобы просто пропустить линии без достаточного количества данных, вы можете сделать это:

String[] items = s.Split(); 
if (items.Count >= 3) 
    this.myDeliverables.Add(new Deliverable(Convert.ToInt32(items[0]), Convert.ToInt32(items[1]), this.myPersons[Convert.ToInt32(items[2])])); 

Однако, то есть ли действительная вещь, чтобы сделать, зависит от того, является ли ошибка в файле данных или ожидаемый формате для этих данных. Если это ошибка в данных, вы должны действительно отобразить сообщение об ошибке.

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