2016-06-18 2 views
-4

텍스트 파일에서 데이터 필드 이름을 내 프로그램으로로드하고 배열 변수에 저장하려고합니다.왜 나는 IndexOutOfRangeException을 얻고 있는지 이해하지 못합니다.

필드 이름은 다른 파일의 데이터를 정렬 된 새 문서로 정렬하고 인쇄하는 데 사용됩니다.

특히 파일의 필드를 배열에 저장하는 데 많은 문제가 있습니다.

데이터 필드 텍스트 파일은 목록 방식으로 구성되며 각 필드는 자체 행에 있습니다.

StreamReader의 Peek()가 -1이 될 때까지 실행되는 while 루프를 만들었습니다.

while 루프 내에서 for 루프를 중첩하여 색인 정수 변수를 1 씩 증가시켜 텍스트 파일의 전체 행 수와 같거나 적습니다.

또한 ReadLine()을 사용하여 텍스트 문서의 행을 특정 인덱스의 배열에 저장합니다. 나는 for 루프에서 각 행을 순환하고 저장할 필요가있는 것을 저장한다고 생각했다.

필자는 필드를 키로 사용하고 그 정보를 표시 할 때 다른 문서의 데이터를 사전 값으로 사용할 수 있도록 사전 내 필드를 사용해야합니다.

필자는 IndexOutOfRangeException을 피하기 위해 필요한 조치를 취한 방법이라고 생각했지만 그럴 수는 없다고 생각합니다.

누구든지이 문제에 도움이되어 주시면 감사하겠습니다. 불분명 한 점이 있으면 사과 드리며 필요한 경우 상황을 명확히하려고 노력할 것입니다. 내 시도 로직 설명은 끔찍했다 경우

, 여기에 코드입니다 : 당신이 배열을 정의 할 때 각 요소에 대한 공간을 확보해야하기 때문에

class Program 
{ 
    protected static string[] dataFields = new string[] { }; 

    static void Main(string[] args) 
    { 
     int iIndex; 

     using (StreamReader titleStream = new StreamReader(@"..\..\DataFieldsLayout.txt")) 
     { 
      while (titleStream.Peek() > -1) 
      { 
       for (iIndex = 0; iIndex <= 150; iIndex++) 
       { 
        // where the exception occurs 
        dataFields[iIndex] = titleStream.ReadLine(); 
       } 
      } 
     } 

     // test 
     Console.WriteLine(dataFields[0]); 
     Console.WriteLine(dataFields[1]); 
     Console.WriteLine(dataFields[2]); 
     Console.WriteLine(dataFields[3]); 
     Console.WriteLine(dataFields[4]); 
    } 
} 
+0

가능한 [IndexOutOfRangeException이란 무엇이며 어떻게 수정합니까?] (http://stackoverflow.com/questions/20940979/what-is-indexoutofrangeexception-and-how-do-i-fix-it) –

+0

요소가 0 인 문자열 배열을 선언했습니다.이 배열에서 모든 종류의 인덱스를 사용할 수 없습니다. – Steve

+0

다른 지점. 파일에 정확히 151 개의 행이나 151 개의 배수가 항상 포함되어 있습니까? – Steve

답변

0

이입니다. 따라서 배열을 선언 할 때 새로운 데이터를 수용 할 여지는 없습니다.

protected static string[] dataFields = new string[151]; 

당신은 (151 개) 요소 (당신의 <= 150 조건 때문에)까지 읽고있는 당신이 원하는, 그래서 (이 모든 데이터에 대한 충분한 공간을 가질 수 있도록) 당신은 다음과 같은 방법으로 배열을 선언 할 수 있습니다 적절한 공간을 확보하십시오.

+0

문자열 [] 대신 목록 을 사용하는 것도 고려하십시오. 컬렉션에 포함될 항목의 수를 절대적으로 확신 할 수있는 횟수는 매우 작고리스트 의 성능 오버 헤드에 실제로 관심이 있다면 C/C++/Rust/Something을 사용해야합니다. 어쨌든 수집 된 쓰레기가 아닙니다. –

+0

@NickBailey 네가 맞다. 특히 원하는 아이템의 수를 모르는 경우. 그런 다음 나중에 목록을'.ToArray() '할 수 있습니다. – Snoopy

+0

그래, 난 읽기 전용이 아닌 배열을 사용한 적이 있는지 모르겠다. –

관련 문제