2014-10-06 2 views
0

Visual Studio에서 vb.NET을 사용하여 숫자 20x20 격자 (공백으로 구분)가 포함 된 텍스트 파일에서 2 차원 배열을 으로 초기화하려고합니다. 2013. 올바르게 작동하려면 루프를 조정했지만 스트림 리더에서 얻은 값은 파일의 내용과 완전히 다릅니다. 여기 텍스트 파일에서 초기화 할 때 직사각형 배열의 다른 값 얻기

이 소스 파일의 내용

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 

입니다

Imports System.IO 
Module Module1 
Dim grid(19, 19) As String 

Sub Main() 
    Dim deskPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) 
    Using upload As New StreamReader(deskPath & "\grid.txt") 
     'Console.WriteLine(upload.ReadToEnd) 

     For x As Integer = 0 To 19 

      For y As Integer = 0 To 19 
       grid(x, y) = upload.Read() '& upload.read() 
       upload.Read() 
      Next 

     Next 
    End Using 

Using outfile As New StreamWriter(deskPath & "\Result1.txt") 
     For y As Integer = 0 To 19 
      For x As Integer = 0 To 19 
       outfile.Write(grid(x, y)) 
       outfile.Write(" ") 
      Next 
      outfile.WriteLine() 
     Next 
    End Using 
End Sub 
End Module 

VB에서 코드입니다 그리고 이것은 배열이

48 56 56 13 32 32 57 50 48 50 55 50 32 32 32 51 48 52 54 52 
32 53 53 56 56 49 13 32 32 53 53 54 52 56 53 32 32 32 50 52 
50 32 32 32 51 52 50 48 53 13 32 32 50 57 48 51 48 54 32 32 
50 50 48 57 32 32 32 52 48 51 52 50 13 32 32 57 48 51 53 55 
32 53 56 51 51 57 49 32 32 32 55 50 50 51 54 13 32 32 53 52 
55 32 32 32 52 50 49 56 52 56 32 32 32 49 52 55 50 49 13 32 
51 55 55 51 32 32 32 54 55 56 54 53 53 32 32 32 49 52 56 48 
32 57 52 53 51 56 49 32 32 32 49 54 53 56 48 55 32 32 32 50 
53 32 32 32 51 53 53 51 51 56 32 32 32 51 52 53 52 53 54 32 
48 56 56 57 32 32 32 49 53 54 56 52 53 32 32 32 48 53 48 56 
32 10 52 49 53 49 55 32 32 32 54 51 54 57 53 56 32 32 32 53 
48 57 32 32 10 51 54 48 56 51 32 32 32 54 49 50 51 56 56 32 
48 52 57 57 50 32 32 10 51 54 48 51 51 32 32 32 53 50 51 52 
32 32 52 57 55 54 57 52 32 32 10 48 57 50 48 53 32 32 32 49 
53 57 32 32 32 55 52 52 52 48 55 32 32 10 54 51 50 48 49 32 
48 52 52 49 53 32 32 32 50 50 50 48 54 49 32 32 10 49 56 56 
32 32 53 52 50 55 50 50 32 32 32 57 57 51 51 55 54 32 32 10 
53 55 32 32 32 48 51 54 53 56 48 32 32 32 57 49 51 52 55 57 
48 56 50 55 52 32 32 32 49 52 54 54 55 51 32 32 32 50 48 56 
32 32 48 53 54 54 52 57 32 32 32 52 55 48 52 52 53 32 32 32 

가 나는 경우 패턴을 찾는 시도했습니다 받고있는 것입니다 값이 잘못된 요소에 저장되고 배열의 데이터 유형이 변경되었으며 스트림을 캐스팅했습니다. 어, int로 (그냥 오류를 준). 각 요소에서 두 자리 숫자를 초기화하기 위해 두 개의 read() 연산을 연결했지만 완전히 다른 (2 자리 잘못된 값과는 무관 함) 4 자리 값을주었습니다. 내가 직접 콘솔에서에서는 StreamReader에서 원시 값을 인쇄하려고이 사람

4856 1052 1310 5313 5749 3256 5032 5452 3257 5732 5149 3253 5432 5349 3248 5732 5150 3251 5732 5649 
4850 3252 4932 5350 1050 1310 4813 5548 3250 5132 5151 3253 5732 5352 3256 5132 5451 3252 5332 4954 
5050 3257 5732 5548 3251 5232 5150 1054 1310 5013 5753 3257 5332 4955 3253 5532 5751 3254 5232 5051 
5755 3252 4932 5753 3249 5532 5756 3250 5232 5049 1055 1310 5513 5356 3252 5632 5351 3255 5232 5355 
5156 3249 5132 5051 3255 5032 5649 3250 5332 5154 3249 5432 5654 1049 1310 5413 5457 3251 5432 4853 
4953 3256 5332 4852 3253 4832 5056 3254 5632 5051 3253 5732 5354 3256 5232 5656 1048 1310 5413 5352 
4848 3249 5732 5448 3254 5732 5452 3248 5332 4857 3250 5332 4848 3256 5032 5154 3252 4832 5048 1048 
5248 3253 5232 4949 3254 5132 5051 3254 5432 5553 3250 5032 5256 3254 5632 5456 3249 5732 5551 3255 
4848 3254 5732 5250 3256 5332 5455 3249 5132 4848 3255 5432 5153 3248 5132 5655 3255 5432 5153 3253 
5553 3256 5132 5457 3252 5032 4948 3250 5732 5554 3251 5332 5549 3257 5532 5355 3251 4932 5057 3255 
4852 3249 4932 5052 3257 5232 5054 3257 5432 5252 3254 4932 5657 3252 5332 5450 3250 5032 5556 3256 
4853 3252 4832 5456 3251 5332 5156 3254 5532 5048 3249 5532 4855 3254 5732 5048 3251 4832 5149 3253 
4855 3257 5532 5354 3253 5132 5248 3257 5532 5253 3257 5332 4853 3250 5432 5550 3249 5132 5748 3253 
5556 3252 5132 4849 3250 5132 5455 3251 5632 5153 3248 5632 5252 3255 5532 4851 3250 5632 4849 3254 
5350 3254 5632 5150 3252 5632 5357 3254 5632 4952 3256 5632 5252 3257 5532 5254 3257 5232 5552 3249 
4950 3252 4832 5354 3252 5432 5352 3248 5432 4848 3248 5232 5155 3249 5532 5151 3255 5032 5149 3257 
5348 3248 5132 5549 3250 5232 5548 3252 5132 5449 3254 4832 5252 3256 5032 5455 3249 5732 5257 3251 
5555 3253 5732 5155 3254 4832 5454 3257 5232 5151 3249 5532 5448 3253 5432 5254 3248 5732 5549 3252 
5749 3254 5132 4850 3251 5332 4956 3254 5632 5755 3249 5232 5049 3249 5432 5353 3252 5032 5256 3254 
4856 3248 5432 5154 3249 5532 5156 3252 5232 5152 3248 5232 5356 3255 5432 4950 3250 5532 5654 3252 

, 그것은 제대로 작동하지만 같은 방법은 배열을 초기화 작동하지 않았다.

아이디어 및 제안 사항은 무엇이든 환영합니다.

감사합니다.

답변

1

당신이보고있는 적어도 두 가지 문제가 있습니다.

첫째, 내부 및 외부 루프의 순서는 배열 내용을 인쇄하는 데 사용하는 코드와 배열을 채우는 데 사용하는 코드에서 다릅니다. 첫 번째 경우에 x는 외부 루프에서 변경되고 y는 내부 루프에서 변경됩니다. 두 번째 설정 루프는 바깥 쪽 루프에서는 y를, 안쪽 루프에서는 x를 변경합니다. 이것은 차이점의 일부를 설명하는 것처럼 보입니다.

더 중요한 것은 인쇄 한 배열의 값이 읽은 문자의 ASCII 코드의 십진수 표현 인 것으로 나타났습니다.

StreamReader.Read()은 입력 스트림에서 다음 문자의 ASCII 값에 해당하는 정수 값을 반환합니다. 이 변수를 문자열 변수에 할당하면 vb.net은 정수 ToString() 메서드를 사용한 것처럼 정수를 문자열로 변환합니다. 이 경우 문자열에는 읽은 실제 문자 대신 원래 읽은 문자의 ASCII 코드의 십진수 값이 포함됩니다.

이 작업을 수행 할 수있는 여러 가지 방법이 있습니다. 한 가지 방법은 TextReader를 사용하여 한 번에 한 줄씩 입력 파일을 읽은 다음 String을 사용하는 것입니다.분할하여 각 개별 숫자의 문자열 표현을 가져옵니다.

+0

아, 인코딩이 문제가 될 것이라고 생각하지 않았습니다. String.split() 영리한 감사 것입니다! –

0

StreamReader.Read 방법에 대한 설명서를 읽었습니까? 단일 문자를 Integer으로 반환합니다. 즉, Char의 유니 코드 값을 반환합니다. 파일의 실제 숫자를 읽으려면 하위 문자열을 읽고 Integer 값으로 변환해야합니다. 이 같은

뭔가 훨씬 더 합리적인 것 같다

Dim grid(19, 19) As Integer 

Using reader As New StreamReader("file path here") 
    For i = 0 To grid.GetUpperBound(0) 
     Dim numbers = reader.ReadLine().Split() 

     For j = 0 To grid.GetUpperBound(1) 
      grid(i, j) = Convert.ToInt32(numbers(j)) 
     Next 
    Next 
End Using 
+0

코드 참조 주셔서 감사합니다. –