2014-06-10 3 views
0

나는이 문제에 대한 어떤 해결책도 적용하지 못했습니다. 예외는이 행에서 발생합니다. currentMap [row, col] = Int32.Parse (s); 내가 뭘 걸려 라하는 것은이 방법이 같은 수의 행을 저장하는 특정 파일을 전달할 수 있습니다 :Int32에서 값이 너무 크거나 작습니다. 텍스트 파일 읽기 및 파싱

1,1,1 
1,0,1 
1,1,1 

내가 다음 각 번호가 INT에 저장할을 [,] 반환됩니다 currentMap. 사용중인 파일에 큰 숫자가 없습니다. 나는 내가 만들고있는 어레이의 크기가 옳다고 생각한다. 그래서 이것이 왜 작동하지 않는지 이해할 수 없다. 나는 자바에서 NextInt를 사용하여 유사한 것들을하는 데 익숙하지만 C#에 대한 대안을 찾지 못했습니다.

도움 주셔서 감사합니다.

private int[,] LoadMapArray(String filename) 
    { 
     int[,] currentMap; 

     int rows = 0; 
     int cols = 0; 

     StreamReader sizeReader = new StreamReader(filename); 

     using (var reader = File.OpenText(filename)) 
     { 
      while (reader.ReadLine() != null) 
      { 
       string line = sizeReader.ReadLine(); 
       cols = line.Length; 
       rows++; 
      } 
     } 
     currentMap = new int[rows,cols]; 

     StreamReader sr = new StreamReader(filename); 

     for (int row = 0; row < rows + 1; row++) 
     { 
      string line = sr.ReadLine(); 
      string[] split = new string[] {","}; 
      string[] result; 

      result = line.Split(split, StringSplitOptions.None); 

      int col = 0; 

      foreach (string s in result) 
      { 
       currentMap[row, col] = Int32.Parse(s); 
       col++; 
      } 
     } 

     return currentMap; 
    } 

편집 : 파일 액세스 방법을 변경 한 후 코드가 수정되었습니다. 그런 다음이 값을 null로 설정해야합니다.

for (int row = 0; row < rows + 1; row++) 
     { 
      string line = sr.ReadLine(); 
      string[] split = new string[] { "," }; 
      string[] result; 

      if (line != null) 
      { 
       result = line.Split(split, StringSplitOptions.None); 

       int col = 0; 

       foreach (string s in result) 
       { 
        currentMap[row, col] = Int32.Parse(s); 
        col++; 
       } 
      } 


     } 
+5

중단되었을 때 s 값이 무엇인지 확인하기 위해 디버깅을 시도 했습니까? – 3dd

+0

예외 세부 정보를 제공해 주시겠습니까? – BayStallion

+0

디스크에있는 파일의 크기는 어느 정도입니까? – Steve

답변

2

아니요, 배열의 크기가 올바르지 않습니다. 각 루프에서 두 줄을 읽지 만 행 카운터를 한 번만 증가시킵니다.

using (var reader = File.OpenText(filename)) 
    { 
     string line = string.Empty; 
     while ((line = reader.ReadLine()) != null) 
     { 
      rows++; 
     } 
    } 

그리고 나는 또한 COLS 카운트 확신이 올바르지 않습니다,하지만 당신은 COLS이 요구되는 것보다 더 큰 치수를 치수 때문에이 예외가 발생하지 않습니다. (파일이 매우 큰되지 않은 경우)

더 간단한 방법 (당신은 또한 쉼표위한 공간뿐만 아니라 숫자를 계산하는 것은) 지금 전체를 File.ReadAllLines()

string[] split = new string[] {","}; 
string[] lines = File.ReadAllLines(filename); 
int rows = lines.Length; 
int cols = lines[0].Split(split, StringSplitOptions.RemoveEmptyEntries).Count(); 
currentMap = new int[rows,cols]; 

for (int row = 0; row < rows; row++) 
{ 
     string line = lines(row); 
     string[] result = line.Split(split, StringSplitOptions.None); 
     int col = 0; 
     foreach (string s in result) 
     { 
      int value; 
      Int32.TryParse(s, out value) 
      currentMap[row, col] = value; 
      col++; 
     } 
} 

을 사용하는 것입니다 파일이 단지 하나의 디스크 작업으로 메모리에 있고 메모리 문자열을 사용하여 작업 할 수 있습니다. 검색된 값이 유효한 정수가 아닌 경우 예외가 발생하지 않도록 Int32.TryParse를 사용하도록 정수 구문 분석을 변경해야합니다.

+0

좋은 답례를 보내 주셔서 감사합니다. 나는 코드를 시도했지만 여전히 같은 문제가있어서 파일을로드하는 방식을 고쳤습니다. 그것이 문제 였기 때문에 무의미한 게시물에 대해 유감스럽게 생각합니다. 그 후 나는 라인이 null인지 먼저 검사하여 원래의 코드가 작동하도록했습니다. 나는 그것을 원래의 질문으로 편집 할 것이다. 모든 것은 여전히 ​​잘 작동하고 배열이 꺼져 있어도 원하는 것을 얻을 수 있습니다. 나는 텍스트 파일을 얼마나 크게 만들지 모르겠다. 나는 그것을 바꿔서 코드를 고수 할 것이다. 텍스트 파일 자체를 파싱 할 수 있는지 확인하기 위해 try 구문 분석은 필요하지 않습니다. 감사합니다. – user3622946

관련 문제