1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [제 5 : 덜 편안] 2 00:00:02,730 --> 00:00:05,180 [네이트 Hardison, 하버드 대학교] 3 00:00:05,180 --> 00:00:08,260 [이 CS50 수 있습니다.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 그래서 사람들은 다시 환영합니다. 5 00:00:11,690 --> 00:00:16,320 섹션 5에 오신걸 환영합니다. 6 00:00:16,320 --> 00:00:20,220 이 시점에서, 퀴즈를 0을 완료 답니다 당신이 한 방법을 볼 수있게 되서, 7 00:00:20,220 --> 00:00:25,770 I 매우이 섹션의 점수에 감동했기 때문 잘하면 니가 정말 좋아. 8 00:00:25,770 --> 00:00:28,050 온라인 시청자를 들어, 우리는 몇 가지 질문을 했어 9 00:00:28,050 --> 00:00:33,680 문제 세트의 마지막 두 가지 문제에 대한 - 또는 퀴즈에, 오히려. 10 00:00:33,680 --> 00:00:39,690 그래서 우리는 모든 사람들이 무슨 일이 일어 났는지 볼 수 있도록 정말 빨리 그 이상 갈거야 11 00:00:39,690 --> 00:00:45,060 하고 오히려 그냥 솔루션 자체를 보는 것보다 실제 솔루션을 통해 이동하는 방법. 12 00:00:45,060 --> 00:00:50,330 우리는 정말 신속하게 문제의 지난 몇 동안 이동 32 33거야. 13 00:00:50,330 --> 00:00:53,240 그냥, 다시, 그래서 온라인 시청자하는 것은이 볼 수 있습니다. 14 00:00:53,240 --> 00:00:59,080 >> 당신은 13 페이지에 문제 32에 설정하면 15 00:00:59,080 --> 00:01:02,730 16 13에서이 문제가 32 모든 스왑에 있습니다. 16 00:01:02,730 --> 00:01:05,010 이 두 정수를 교환에 관한 모든이었습니다. 17 00:01:05,010 --> 00:01:08,740 우리가 강의에서 몇번 겪었으니하는 문제입니다. 18 00:01:08,740 --> 00:01:13,590 그리고 여기, 우리가 당신 한테 부탁 한 것은 빠른 메모리 추적합니다. 19 00:01:13,590 --> 00:01:17,000 그들은 스택에있는 같은 변수의 값을 채워 20 00:01:17,000 --> 00:01:20,250 코드는 스왑 기능을 통해 전진. 21 00:01:20,250 --> 00:01:24,500 특히, 우리는보고 - 난이 아이 패드를 놓을 - 22 00:01:24,500 --> 00:01:29,650 특히, 우리가보고있는 것은이 줄은 이곳에서 6 권리를 번호입니다. 23 00:01:29,650 --> 00:01:36,740 그리고는 이전 문제를 단지 접근을 위해 6 번호가있어. 24 00:01:36,740 --> 00:01:41,720 우리가 원하는 것은 메모리의 상태를 표시하거나 라벨입니다 25 00:01:41,720 --> 00:01:46,090 우리가이 광고 번호 6을 실행하면 시간에로 26 00:01:46,090 --> 00:01:52,540 이는 효과적으로 우리의 여기 스왑 함수에서 반환됩니다. 27 00:01:52,540 --> 00:01:59,450 우리가 여기까지 스크롤하면, 우리는 메모리에 모든 주소가 우리에게 제공 한 것을 보았다. 28 00:01:59,450 --> 00:02:02,540 이 매우 중요합니다, 우리는 한 순간에 다시 갈 게요. 29 00:02:02,540 --> 00:02:09,240 그리고 여기 아래에, 우리는 우리가 참조 할 것 같군 작은 메모리도했다. 30 00:02:09,240 --> 00:02:12,490 사실 난 내 아이 패드에이을 다했습니다. 31 00:02:12,490 --> 00:02:20,720 그래서 난 참조 용으로 아이 패드와 코드 사이를 앞뒤로 번갈아거야. 32 00:02:20,720 --> 00:02:26,540 >> 의 시작하자. 첫째, 바로 여기에 주요 행의 첫 번째 몇에 초점을 맞춰 보자. 33 00:02:26,540 --> 00:02:30,220 시작하려면, 우리는 2로 1 Y x를 초기화거야. 34 00:02:30,220 --> 00:02:33,040 우리는 두 정수 변수를 가지고 그래서, 그들은 스택에 배치 될 것 모두. 35 00:02:33,040 --> 00:02:36,050 우리는 그들에 1과 2를하겠습니다. 36 00:02:36,050 --> 00:02:43,150 내 아이 패드로 뒤집기다면, 희망, 보자 - 37 00:02:43,150 --> 00:02:48,660 애플 TV 미러링, 그리고 거기 우리는 간다. 좋아요. 38 00:02:48,660 --> 00:02:51,670 내 아이 패드로 뒤집기면하면, 39 00:02:51,670 --> 00:02:56,220 I 2로 1 Y x를 초기화하고 싶습니다. 40 00:02:56,220 --> 00:03:00,580 우리는 X를 표시 상자에 1을 작성하여 간단 그런 짓을 41 00:03:00,580 --> 00:03:07,730 그리고 상자에 2 y를 표시했습니다. 상당히 간단합니다. 42 00:03:07,730 --> 00:03:11,620 그래서 지금의이 노트북으로 돌아 가자고, 다음번에 일어날 일을 참조하십시오. 43 00:03:11,620 --> 00:03:15,810 상황이 까다로운 얻을 곳이 다음 줄 것입니다. 44 00:03:15,810 --> 00:03:28,110 우리는 매개 변수로 x의 주소와 y의 주소를 전달 스왑 함수 a와 b. 45 00:03:28,110 --> 00:03:32,380 x와 y의 주소의 주소는 우리가 계산 할 수 없습니다 물건 46 00:03:32,380 --> 00:03:36,360 이 총알을 참조하지 않고 바로 여기 아래 지적했다. 47 00:03:36,360 --> 00:03:39,750 다행히도, 처음 두 글 머리 기호는 답변이 정확히 알려주세요. 48 00:03:39,750 --> 00:03:44,740 메모리에서 x의 주소는 10이며, 메모리 y의 주소는 14입니다. 49 00:03:44,740 --> 00:03:51,870 그래서 그것들은로 전달받을 값입니다 및 스왑 함수에서 위에서 나. 50 00:03:51,870 --> 00:04:00,760 그럼 다시, 우리의 다이어그램으로 전환, 나도은 10를 작성할 수 51 00:04:00,760 --> 00:04:07,400 B와 14. 52 00:04:07,400 --> 00:04:11,610 우리가 스왑을 진행 위치를 지금이 시점입니다. 53 00:04:11,610 --> 00:04:14,520 자, 다시 노트북으로 돌아 내리고 54 00:04:14,520 --> 00:04:21,079 우리는 스왑을 작동하는 방법은 TMP에와 상점의 결과 I 첫번째 역 참조입니다 참조하십시오. 55 00:04:21,079 --> 00:04:27,650 따라서 역 참조 연산자는 야 "라고. 주소와 같은 변수의 내용을 다룹니다. 56 00:04:27,650 --> 00:04:33,830 그 주소에 저장되어있는 어떤으로 이동하여로드합니다. " 57 00:04:33,830 --> 00:04:41,720 당신이 변수에서로드 것은 우리의 TMP 변수에 저장 될 것입니다. 58 00:04:41,720 --> 00:04:45,150 아이 패드로 돌립니다. 59 00:04:45,150 --> 00:04:51,690 우리가 10 해결로 이동하는 경우, 우리는 주소를 10 varible X 것을 알고 60 00:04:51,690 --> 00:04:55,480 우리는 메모리에서 x의 주소는 10입니다 우리의 총알 포인트가 말한 있었 으니까. 61 00:04:55,480 --> 00:05:00,180 그래서 우리는, 우리가 아이 패드에서 볼 수로, 거기에 가서 1 그것의 가치를 얻을 수 있습니다 62 00:05:00,180 --> 00:05:06,300 그 TMP로로드합니다. 63 00:05:06,300 --> 00:05:08,250 다시 말하지만,이 마지막 내용이 없습니다. 64 00:05:08,250 --> 00:05:14,350 우리는을 통해 걸어 갈 거에요, 그리고 우리는 말에 프로그램의 최종 상태로 연결됩니다. 65 00:05:14,350 --> 00:05:17,210 하지만 지금, 우리는 tmp 디렉토리에 저장되어있는 값 1이 있습니다. 66 00:05:17,210 --> 00:05:19,210 >> 그리고 여기에 빠른 질문이 있어요. 67 00:05:19,210 --> 00:05:23,980 [알렉산더] 역 참조 연산자입니까 - 그냥 변수 앞의 별이있어? 68 00:05:23,980 --> 00:05:27,600 >> 예. , 우리는 다시 한번 우리의 노트북에 다시 뒤집기으로 역 참조 연산자 그래서 69 00:05:27,600 --> 00:05:33,780 앞이 스타입니다. 70 00:05:33,780 --> 00:05:37,460 그런 의미에서, 그래 - 당신은 곱셈 연산자로 대조 71 00:05:37,460 --> 00:05:42,400 이는 두 가지가 필요하고, 역 참조 연산자는 단항 연산자입니다. 72 00:05:42,400 --> 00:05:46,130 그냥 바이너리 연산자는 반대로 하나의 값에 적용하면, 73 00:05:46,130 --> 00:05:48,810 당신은 두 개의 서로 다른 값으로 적용 곳. 74 00:05:48,810 --> 00:05:52,080 그 말씀은 라인에 무슨 일이 일어날 지 알려주지. 75 00:05:52,080 --> 00:05:58,390 우리는 값 1을로드하고 임시 정수 변수에 저장. 76 00:05:58,390 --> 00:06:05,800 다음 행은, 우리는에 B의 내용을 저장합니다 - 77 00:06:05,800 --> 00:06:12,630 또는, 오히려, 우리는 B가가 가리키는 곳으로 가리키는되는 내용을 저장합니다. 78 00:06:12,630 --> 00:06:17,690 우리가 오른쪽에서 왼쪽으로이 분석하면, 우리는 역 참조 B로가는거야 79 00:06:17,690 --> 00:06:23,580 우리가 14 해결하려고, 우리는이 정수를 잡아 거에요 80 00:06:23,580 --> 00:06:26,900 그리고 우리는, 주소 10가는거야 81 00:06:26,900 --> 00:06:34,240 우리는 그 공간에 B 우리의 역 참조의 결과를 던져 버릴 수 있습니다. 82 00:06:34,240 --> 00:06:40,080 우리가이 좀 더 구체적으로 만들 수 있습니다 우리의 아이 패드로 다시 내리고, 83 00:06:40,080 --> 00:06:44,070 여기 주소의 모든에 번호를 작성하면 도움이 있습니다. 84 00:06:44,070 --> 00:06:53,820 그래서 우리는 Y에, 우리는 주소를 14 것을 알고, x는 주소 10시. 85 00:06:53,820 --> 00:07:00,180 우리가 B에서 시작하면, 우리는 역 참조 B는, 우리는 값 2를 잡아거야. 86 00:07:00,180 --> 00:07:08,320 우리는이 주소 14 사는 값이 있기 때문에이 값을 가져 갈 수 있습니다. 87 00:07:08,320 --> 00:07:15,700 그리고 우리는, 주소 열에서 살고 변수에 넣어 것 88 00:07:15,700 --> 00:07:19,160 이는 우리 변수 x에 해당하는, 바로 거기에 있습니다. 89 00:07:19,160 --> 00:07:21,810 그래서 우리는 여기에 덮어 쓰기 약간을 수행 할 수 90 00:07:21,810 --> 00:07:35,380 우리는 우리의 일을 제거하고 그 대신 우리는 2 쓸 곳. 91 00:07:35,380 --> 00:07:39,560 이 모든 우리는 이제 덮어 X를 했는데도 잘 세계에서 좋아요. 92 00:07:39,560 --> 00:07:44,890 우리는 우리의 TMP 변수에서 x의 이전 값을 저장하고 있습니다. 93 00:07:44,890 --> 00:07:50,210 그래서 우리는 다음 행으로 스왑을 완료 할 수 있습니다. 94 00:07:50,210 --> 00:07:53,030 우리 노트북으로 돌립니다. 95 00:07:53,030 --> 00:07:58,150 지금 그 유적은 우리의 임시 정수 변수의 내용을 제거입니다 96 00:07:58,150 --> 00:08:05,630 와 B가 들고있는 주소에서 살고있는 변수에 보관하십시오. 97 00:08:05,630 --> 00:08:10,230 그래서 우리는 변수에 대한 액세스를 얻을 효율적으로 역 참조를 B에가는거야 98 00:08:10,230 --> 00:08:14,340 즉, B는 거기에 보유하고있는 주소입니다 99 00:08:14,340 --> 00:08:19,190 우리는 TMP가에 들고있는 값을 쑤셔거야. 100 00:08:19,190 --> 00:08:23,280 한 번 더 아이 패드로 다시 돌립니다. 101 00:08:23,280 --> 00:08:31,290 내 말은, 여기 2이 값을 지울 수 있습니다 102 00:08:31,290 --> 00:08:41,010 대신 우리는으로 한 권리를 복사합니다. 103 00:08:41,010 --> 00:08:43,059 그런 다음 과정을 실행하는 다음 줄 - 104 00:08:43,059 --> 00:08:47,150 우리가 노트북으로 다시 뒤집기 경우 -이 시점 6입니다 105 00:08:47,150 --> 00:08:52,500 우리 그림이 완전히 작성하고 싶었되는 점은 어떤 것입니다. 106 00:08:52,500 --> 00:08:58,940 그래서 아이 패드에 다시 내리고는 다시 한 번, 그렇게 당신은 완성 된 그림을 볼 수 있습니다 107 00:08:58,940 --> 00:09:06,610 당신은 우리가 X에서의 10, B에 14, tmp 디렉토리에있는 1, 2,와 y에 1을 가지고 볼 수 있습니다. 108 00:09:06,610 --> 00:09:11,000 이것에 대해 질문이 있습니까? 109 00:09:11,000 --> 00:09:14,640 이건 통해 걸어 것에 더 의미가 있습니까? 110 00:09:14,640 --> 00:09:24,850 덜 이해가가? 희망이 없습니다. 좋아요. 111 00:09:24,850 --> 00:09:28,230 >> 포인터는 매우 까다로운 될 수 있습니다. 112 00:09:28,230 --> 00:09:33,420 우리가 함께 일하는 사람들 중 하나는 매우 일반적인 말이 있습니다 : 113 00:09:33,420 --> 00:09:36,590 "포인터를 이해하려면 먼저 포인터를 이해해야합니다." 114 00:09:36,590 --> 00:09:40,530 어떤 나는 매우 사실이라고 생각합니다. 그것은 익숙해 질 수있는 시간이 걸릴하지 않습니다. 115 00:09:40,530 --> 00:09:45,360 매우 도움이되며, 사진을 많이 그리기 이와 같은 메모리 다이어그램을 많이 그리기 116 00:09:45,360 --> 00:09:49,480 당신은 예를 들어 한 후 예를 들어 한 후 예를 들어 통과 후, 117 00:09:49,480 --> 00:09:54,450 그것은 좀 더 감각과 좀 더 감각과 조금 더 이해하기 시작합니다. 118 00:09:54,450 --> 00:10:01,560 마지막으로, 언젠가는 모든이 완전히 마스터해야합니다. 119 00:10:01,560 --> 00:10:13,800 우리는 다음 문제로 이동? 질문하기 전에 괜찮아요. 120 00:10:13,800 --> 00:10:18,840 따라서 노트북에 다시 뒤집기. 121 00:10:18,840 --> 00:10:23,300 우리가 다음 문제는 문제 33 번 파일에 있습니다 I / O. 122 00:10:23,300 --> 00:10:26,350 이 약간 확대합니다. 123 00:10:26,350 --> 00:10:28,710 문제 33 - 네? 124 00:10:28,710 --> 00:10:32,110 >> [다니엘] 난 그냥 간단한 질문을했다. 이 별, 또는 별표, 125 00:10:32,110 --> 00:10:35,590 그것은 당신이 전에 별표를 사용하면 dereferencing라고. 126 00:10:35,590 --> 00:10:38,820 당신은 전에 앰퍼샌드를 사용할 때이 제목이 뭐야? 127 00:10:38,820 --> 00:10:43,140 >> 앰퍼샌드은 이전 주소 -의 운영자입니다. 128 00:10:43,140 --> 00:10:45,880 그럼가 다시 스크롤 보자. 129 00:10:45,880 --> 00:10:49,310 죄송합니다. 너무 내가 할 수있는 정말 스크롤되지 줌 모드에서입​​니다. 130 00:10:49,310 --> 00:10:52,780 우리는 바로 여기 정말 빨리이 코드를 보면, 131 00:10:52,780 --> 00:10:54,980 다시 같은 일이 벌어지고 있습니다. 132 00:10:54,980 --> 00:10:59,180 우리가 바로이 코드를 보면,이 라인에서 우리는 통화, 교환 만드는 곳 133 00:10:59,180 --> 00:11:10,460 앰퍼샌드는 "주소 변수 x의 삶을 삽시다."라고되어 있습니다 134 00:11:10,460 --> 00:11:14,460 당신의 컴파일러가 코드를 컴파일 할 때하면 135 00:11:14,460 --> 00:11:20,590 실제로 물리적으로 살 수 있도록 모든 변수에 대해 메모리에 장소를 표시합니다. 136 00:11:20,590 --> 00:11:24,910 이 모든 컴파일 된 후 그리고 컴파일러는 다음 무엇을 할 수 137 00:11:24,910 --> 00:11:31,110 는 "오, 난 주소 10 x를 넣어. 나는 주소 14 y를 넣어."알고 138 00:11:31,110 --> 00:11:34,640 그런 다음 당신을 위해이 값을 입력 할 수 있습니다. 139 00:11:34,640 --> 00:11:44,740 그럼 당신은 그때 할 수 있습니다 - 그럼뿐만 아니라 및 패스 & Y에서이 작업을 전달할 수 있습니다. 140 00:11:44,740 --> 00:11:50,730 ,이 사람들은 주소를 얻을뿐만 아니라, 언제 스왑 기능으로 합격 141 00:11:50,730 --> 00:11:55,690 이러한 유형의 정보, 바로 여기 INT *은, 컴파일러를 알려줍니다 142 00:11:55,690 --> 00:12:01,350 "그래, 우리는 정수 변수의 주소로이 주소를 해석 할 것"이라고 말했다. 143 00:12:01,350 --> 00:12:05,900 정수의 주소되는데,이 문자 변수의 주소를 다른 144 00:12:05,900 --> 00:12:09,930 정수는 32 비트 시스템에 차지하기 때문에, 공간의 4 바이트를 차지 145 00:12:09,930 --> 00:12:13,310 문자는 공간 1 바이트를 차지 반면. 146 00:12:13,310 --> 00:12:17,310 그게 무엇인지를 알고하는 것이 중요이야 - 사는 무슨 가치를 어떤 타입의 147 00:12:17,310 --> 00:12:20,340 인치 통과 했어요 주소에 살고 148 00:12:20,340 --> 00:12:22,020 당신이 상대하고있는 또는 주소를 입력합니다. 149 00:12:22,020 --> 00:12:29,020 이렇게, 당신은 얼마나 많은 바이트의 정보가 실제로 RAM에서로드 할 수 알아요. 150 00:12:29,020 --> 00:12:31,780 그리고, 그래, 당신 같은이 역 참조 연산자는, 요구 된 151 00:12:31,780 --> 00:12:37,200 들어가서 특정 주소에 대한 정보를 액세스합니다. 152 00:12:37,200 --> 00:12:42,820 그래서 여기이 변수라고, 주소와 같은 내용을 취급, 153 00:12:42,820 --> 00:12:47,880 해당 주소로 이동하여 끌어 등록에 프로세서 부하로로드 154 00:12:47,880 --> 00:12:56,340 실제 값 또는 해당 주소에 살고있는 콘텐츠입니다. 155 00:12:56,340 --> 00:12:59,620 질문 더 있습니까? 이러한 좋은 질문들입니다. 156 00:12:59,620 --> 00:13:01,650 그건 너무 새로운 용어 많이 있습니다. 157 00:13:01,650 --> 00:13:09,800 그것은 다른 곳에서 &와 * 표시도 펑키 한 종류입니다. 158 00:13:09,800 --> 00:13:13,180 >> 괜찮아요. 159 00:13:13,180 --> 00:13:18,530 그러니까 문제 33, 파일 I / O. 160 00:13:18,530 --> 00:13:22,540 이건 내가 몇 가지 일이 생각 이러한 문제 중 하나였습니다. 161 00:13:22,540 --> 00:13:25,400 하나는, 그것은 상당히 새로운 주제입니다. 162 00:13:25,400 --> 00:13:30,590 그것은, 퀴즈를하기 전에 곧 발표가 된 163 00:13:30,590 --> 00:13:33,400 그리고 나는 수학에서 해당 단어 문제 중 하나와 같은 가지 생각 164 00:13:33,400 --> 00:13:39,720 어디에 당신에게 많은 정보를 제공하지만, 실제로 그것의 톤을 사용할 필요 결국하지 않습니다. 165 00:13:39,720 --> 00:13:44,060 이 문제의 첫 번째 부분은 CSV 파일이 뭔지 설명되어 있습니다. 166 00:13:44,060 --> 00:13:50,620 이제 CSV 파일, 설명에 의하면, 쉼표로 구분 된 값 파일입니다. 167 00:13:50,620 --> 00:13:55,300 이 모든 재미에 있습니다 이유, 그리고 다시를 사용하는 이유 168 00:13:55,300 --> 00:14:00,800 왜냐하면, 어떻게 많은 적 Excel과 같은 물건을 사용했을입니까? 169 00:14:00,800 --> 00:14:03,240 아마, 또는 당신의 삶에 어떤 시점에서 사용이 당신의 대부분을 그림. 170 00:14:03,240 --> 00:14:06,430 당신은 Excel과 같은 것을 사용합니다. 171 00:14:06,430 --> 00:14:10,940 Excel 스프레드 시트의 데이터를 얻거나 그것으로 처리 어떤 종류를하기 위해, 172 00:14:10,940 --> 00:14:17,240 당신은 C 프로그램이나 파이썬 프로그램, 자바 프로그램을 작성하고자 할 경우 173 00:14:17,240 --> 00:14:20,070 당신이 거기에 저장 한 데이터를 처리하기 위해, 174 00:14:20,070 --> 00:14:23,170 그것을 꺼내하는 가장 일반적인 방법 중 하나가 CSV 파일에 있습니다. 175 00:14:23,170 --> 00:14:26,850 당신은, dialogue '다른 이름으로 저장'로 이동할 때 그리고 당신은 Excel을 열고 수 176 00:14:26,850 --> 00:14:32,840 당신은 실제 CSV 파일을 얻을 수 있습니다. 177 00:14:32,840 --> 00:14:35,890 >> 이런 것들을 처리하는 방법을 알고하는 것이 편리. 178 00:14:35,890 --> 00:14:42,010 작동 방법은 비슷합니다 것입니다 - 내 말은, 그것은 본질적으로, 스프레드 시트를 흉내 낸 것 179 00:14:42,010 --> 00:14:47,590 어디 우리가보다시피, 가장 왼쪽 대부분의 작품에서 180 00:14:47,590 --> 00:14:49,910 우리는 마지막으로 이름이 있습니다. 181 00:14:49,910 --> 00:14:54,670 그래서 우리는 다음 Malan, Hardison 후 보덴, MacWilliam 후 찬 있습니다. 182 00:14:54,670 --> 00:14:59,470 모든 마지막 이름입니다. 그리고 쉼표는 첫 번째 이름과 마지막 이름을 분리합니다. 183 00:14:59,470 --> 00:15:02,970 데이빗, 네이트, 로브, 토미, 그리고 Zamyla. 184 00:15:02,970 --> 00:15:06,850 항상 로비와 톰를 섞는다. 185 00:15:06,850 --> 00:15:10,940 그리고, 마지막으로, 세 번째 열은 이메일 주소입니다. 186 00:15:10,940 --> 00:15:18,500 당신이 이해되면, 프로그램의 나머지 부분은 구현하기가 매우 간단합니다. 187 00:15:18,500 --> 00:15:23,850 우리는 우리의 C 프로그램에서이 같은 구조를 모방하기 위해 무슨 짓을했는지 188 00:15:23,850 --> 00:15:27,510 우리는 구조를 사용했습니다된다. 189 00:15:27,510 --> 00:15:30,520 우리는뿐만 아니라이 조금 더 가지고 노는 시작합니다. 190 00:15:30,520 --> 00:15:35,790 우리는 사전 처리 된 문제 세트 3, 최초의 약간의 사람들을 보았다. 191 00:15:35,790 --> 00:15:40,290 그러나이 직원 구조체는 마지막 이름, 이름과 이메일을 저장합니다. 192 00:15:40,290 --> 00:15:44,500 우리의 CSV 파일 등이 저장되었습니다. 193 00:15:44,500 --> 00:15:47,950 그래서 단 한 형식에서 다른 변환합니다. 194 00:15:47,950 --> 00:15:54,630 우리는 선으로,이 경우 직원 구조체로 변환해야합니다 195 00:15:54,630 --> 00:15:59,060 그와 같은 쉼표로 구분 선. 196 00:15:59,060 --> 00:16:01,500 그게 말이나 돼? 당신들은 모든 퀴즈를 촬영 한 197 00:16:01,500 --> 00:16:07,680 나는 당신이 적어도 이것에 대해 생각할 시간을 가지고 상상해보십시오. 198 00:16:07,680 --> 00:16:16,410 >> 대여 함수에서 문제가 우리가 수행하기를 부탁합니다 -이 약간의 뇌물로 확대 - 199 00:16:16,410 --> 00:16:22,480 , 이름 s와 (과), 직원 구조, 직원 구조체에 걸릴 200 00:16:22,480 --> 00:16:30,900 우리의 staff.csv 파일에 내용을 추가합니다. 201 00:16:30,900 --> 00:16:34,230 그것은이 사용하기 매우 간단하다고 밝혀졌다. 202 00:16:34,230 --> 00:16:37,430 우리는 가지가 조금 더 이러한 기능 오늘 놀러됩니다. 203 00:16:37,430 --> 00:16:44,510 그러나이 경우에, fprintf 함수는 정말 중요합니다. 204 00:16:44,510 --> 00:16:51,960 따라서 fprintf와 함께, 우리는 너희들이 printf이 모든 용어를 사용해 왔습니다처럼 인쇄 할 수 있습니다. 205 00:16:51,960 --> 00:16:55,050 당신은 파일에 printf 줄 수 있습니다. 206 00:16:55,050 --> 00:16:59,030 대신 일반적인 printf 전화를을 그래서 당신은 그것을 형식 문자열을 제공 곳 207 00:16:59,030 --> 00:17:05,380 그리고 당신은 다음 인수와 함께 모든 변수를 대체 208 00:17:05,380 --> 00:17:11,290 fprintf와 함께 귀하의 첫 인자는 대신에 당신이 기록 할 파일입니다. 209 00:17:11,290 --> 00:17:21,170 우리는 사람 fprintf 예를 들어, 어플라이언스에 이것 좀 봐한다면 210 00:17:21,170 --> 00:17:25,980 우리는 printf와 fprintf의 차이점을 볼 수 있습니다. 211 00:17:25,980 --> 00:17:28,960 내가 여기에 조금 확대됩니다. 212 00:17:28,960 --> 00:17:33,140 printf와 그래서, 우리는 우리가 그것을 형식 문자열을 제공 한 다음 이후의 인수 213 00:17:33,140 --> 00:17:37,580 의 형식 문자열로 교체 또는 대체에 대한 모든 변수입니다. 214 00:17:37,580 --> 00:17:47,310 fprintf 반면, 첫 번째 인수는 실제로 스트림이라는이 파일 *입니다. 215 00:17:47,310 --> 00:17:51,800 >> 우리 대여에 여기에 다시 이동 216 00:17:51,800 --> 00:17:54,550 우리는 이미 파일 * 스트림이 우리를 위해 열려있어. 217 00:17:54,550 --> 00:17:57,810 그거 내가이 첫 번째 줄은 무엇을, 그것은 staff.csv 파일을 엽니 다, 218 00:17:57,810 --> 00:18:01,690 이 추가 모드에 열리고, 우리가 할 남은 건입니다 219 00:18:01,690 --> 00:18:08,640 파일에 직원 구조를 써주세요. 220 00:18:08,640 --> 00:18:10,870 그리고 제가 아이 패드를 사용하려면 어떻게, 어디 보자? 221 00:18:10,870 --> 00:18:17,900 나는 iPad를 사용합니다. 우리는 무효가 - 좀 더 쓸 수 있도록 테이블에 넣어까요? - 222 00:18:17,900 --> 00:18:33,680 대여를 취소하고, 한 인수에 S라는 직원 구조를 걸립니다. 223 00:18:33,680 --> 00:18:44,120 우리 교정기있어, 우리는, 파일라고하며 파일 *이 있어요 224 00:18:44,120 --> 00:18:48,380 우리는 우리에게 주어진 우리의 fopen 줄이 225 00:18:48,380 --> 00:18:51,890 이 pedia에 이미 않았고, 난 점으로 기록됩니다. 226 00:18:51,890 --> 00:19:00,530 그리고 우리의 다음 줄에, 우리는 fprintf에 전화를 걸거야 227 00:19:00,530 --> 00:19:03,700 우리는, 우리가 인쇄 할 파일에 전달 할거야 228 00:19:03,700 --> 00:19:10,290 다음의 형식 문자열,있는 - 229 00:19:10,290 --> 00:19:14,300 나는 너희들이 어떻게 생겼는지 말해 드리겠습니다. 230 00:19:14,300 --> 00:19:20,500 당신은 어때요, 스텔라? 당신은 형식 문자열의 첫 번째 부분이 어떻게 생겼는지 알 수 있습니까? 231 00:19:20,500 --> 00:19:24,270 [스텔라] 내가 모르겠어. >> 지미 물어 주시기 바랍니다. 232 00:19:24,270 --> 00:19:27,690 당신은 지미를 아세요? 233 00:19:27,690 --> 00:19:31,000 [지미]는 그냥 마지막 주시겠습니까? 모르겠어요. 저도 잘 모르겠습니다. 234 00:19:31,000 --> 00:19:39,020 좋아요 >>. 어때요, 사람은 시험에서이 올바른 거죠? 235 00:19:39,020 --> 00:19:41,770 좋아, 안돼. 236 00:19:41,770 --> 00:19:47,920 여기 우리가해야 할 일은 우리가 저희 직원 구조의 각 부분을 원이라고 밝혀 237 00:19:47,920 --> 00:19:53,290 우리 파일에 문자열로 출력 할 수 있습니다. 238 00:19:53,290 --> 00:19:59,900 우리가 성을 가지고 있기 때문에 우리는 문자열 대체 문자 세 다른 시간을 사용하여 239 00:19:59,900 --> 00:20:07,160 쉼표 뒤에 다음, 첫 번째 이름은 쉼표로 이어 240 00:20:07,160 --> 00:20:12,430 그리고 마지막 한 이메일 주소가옵니다 -이 아닌 241 00:20:12,430 --> 00:20:15,140 내 화면에 맞는 - 그러나 그 줄 바꿈 문자 뒤에있어. 242 00:20:15,140 --> 00:20:20,060 그래서 난 저기를 작성하는거야. 243 00:20:20,060 --> 00:20:23,560 그리고, 우리의 형식 문자열에 따라 244 00:20:23,560 --> 00:20:27,880 우리는 우리가 점 표기법을 사용하여 액세스하는 대체이 245 00:20:27,880 --> 00:20:31,370 우리는 문제 세트 3 본. 246 00:20:31,370 --> 00:20:48,820 우리는 s.last, s.first 및 s.email를 사용할 수 있습니다 247 00:20:48,820 --> 00:20:58,990 의 형식 문자열에 세 값을 대체합니다. 248 00:20:58,990 --> 00:21:06,190 그래서 어떻게 됐어? 이해가가? 249 00:21:06,190 --> 00:21:09,700 그래? 아냐? 가능? 좋아요. 250 00:21:09,700 --> 00:21:14,180 >> 우리가 인쇄 한 우리가 우리의 파일을 오픈 한 후 이후에 우리가하는 마지막으로 한가지 : 251 00:21:14,180 --> 00:21:17,370 우리가 파일을 오픈 한 할 때마다, 우리는 항상 문을 닫을 것을 기억해야합니다. 252 00:21:17,370 --> 00:21:19,430 그렇지 않으면 우리가 메모리가 누수 헤어지는 것 때문에하는 것은 253 00:21:19,430 --> 00:21:22,500 파일 설명을 사용합니다. 254 00:21:22,500 --> 00:21:25,950 그래서 우리는 어떤 기능을 사용합니까, 그것을 닫으려면? 다니엘? 255 00:21:25,950 --> 00:21:30,120 [다니엘] fclose? 정확히 >> fclose. 256 00:21:30,120 --> 00:21:37,520 따라서이 문제의 마지막 부분은 fclose 함수를 사용하여 파일을 올바르게을 닫으 것이 었습니다 257 00:21:37,520 --> 00:21:40,370 이는 그 것 같습니다. 258 00:21:40,370 --> 00:21:43,880 미친 짓 없습니다. 259 00:21:43,880 --> 00:21:46,990 좋아. 260 00:21:46,990 --> 00:21:49,520 그래서 그런 퀴즈의 문제가 33입니다. 261 00:21:49,520 --> 00:21:52,480 우리는 I / O가 오는 확실히 더 많은 파일이 있습니다. 262 00:21:52,480 --> 00:21:55,130 우리는 지금 오늘 강의에서 조금 더 많은 일을, 또는 섹션에합니다 263 00:21:55,130 --> 00:22:01,710 그이 다가오는 pset의 대량를 형성 무슨 일 때문이에요. 264 00:22:01,710 --> 00:22:05,020 가이 시점에서 퀴즈에서 이동하세요. 그래? 265 00:22:05,020 --> 00:22:10,880 >> [샬롯]] 왜 대신에 fclose의 fclose (파일) (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> 아. 이 것이 밝혀하기 때문에 - 그래서 질문은, 큰 중 하나입니다 것은, 267 00:22:19,100 --> 00:22:27,800 왜 우리가 fclose를 쓸 때, 우리는 fclose (파일) 성 변수를 작성하는합니다 268 00:22:27,800 --> 00:22:33,680 로 파일 이름, staff.csv에 반대? 그 맞습니까? 그래. 269 00:22:33,680 --> 00:22:39,570 그러니를 살펴 보자. 내 노트북​​로 다시 전환하는 경우는, 270 00:22:39,570 --> 00:22:45,040 과의이 fclose 함수를 살펴 보도록하겠습니다. 271 00:22:45,040 --> 00:22:51,460 그래서, fclose 함수는 스트림을 닫고, 우리가 가까이 할 스트림 포인터에 소요 272 00:22:51,460 --> 00:22:57,010 으로 우리가 접근 할 실제 파일 이름에 반대했습니다. 273 00:22:57,010 --> 00:23:01,620 그리고이 때문에 장면 뒤에, 당신은 fopen에 전화를 걸 때입니다 274 00:23:01,620 --> 00:23:12,020 당신은 파일을 열 때, 당신은 실제로 파일에 대한 정보를 저장 메모리를 할당하고 있습니다. 275 00:23:12,020 --> 00:23:16,380 당신은 파일에 대한 정보를 파일 포인터가 276 00:23:16,380 --> 00:23:23,080 이 열려있는 등, 당신이 파일에 현재의 크기,, 277 00:23:23,080 --> 00:23:29,100 당신은 읽고 파일 내에서 특정 장소에 호출을 작성 할 수 있도록. 278 00:23:29,100 --> 00:23:38,060 대신 파일 이름을 해지 포인터를 닫는 결국. 279 00:23:38,060 --> 00:23:48,990 >> 그래? [다니엘] 지금 대여를 사용하려면, 당신 생각은 어때요 - 어떻게는 사용자 입력을받을입니까? 280 00:23:48,990 --> 00:23:53,830 fprintf 그냥 사용자 입력을 기다리겠습니다이라는 관점에 입각 GetString처럼 행동 하는가 281 00:23:53,830 --> 00:23:57,180 그리고이를 입력하도록 요청 - 또는 이러한 세 가지를 입력하길 기다리라고? 282 00:23:57,180 --> 00:24:00,480 또는 대여를 구현하는 무언가를 사용해야합니까? 283 00:24:00,480 --> 00:24:04,100 >> 그래. 그래서 우리는이 아니에요 - 문제는 어떻게 우리는 사용자 입력을 어떻게해야합니까되었습니다 284 00:24:04,100 --> 00:24:09,220 대여를 구현하려면? 그리고 우리가 여기있는 것은, 대여의 호출자입니다 285 00:24:09,220 --> 00:24:17,690 이미 구조체에 저장된 모든 데이터와 함께 직원 구조체에 통과 시켰습니다. 286 00:24:17,690 --> 00:24:22,990 따라서 fprintf 단지 파일에 직접 데이터를 작성 할 수 있습니다. 287 00:24:22,990 --> 00:24:25,690 는 사용자 입력을 기다리는이 없습니다. 288 00:24:25,690 --> 00:24:32,110 사용자가 이미 제대로이 직원 구조체에 넣어하여 입력을 뺏기는군요. 289 00:24:32,110 --> 00:24:36,510 이러한 포인터 중 하나가 널 (null)이라면 일들은 물론, 대냐 290 00:24:36,510 --> 00:24:40,370 그래서 우리는 여기까지 다시 스크롤하고 우리는 우리의 구조체보세요. 291 00:24:40,370 --> 00:24:43,640 우리는 문자열 마지막으로, 문자열 첫째, 문자열 이메일을 갖추고 있습니다. 292 00:24:43,640 --> 00:24:48,530 우리는 지금 그 정말 모두, 후드 아래 숯불 * 변수 않고 있다는 것도 알고있다. 293 00:24:48,530 --> 00:24:53,470 그래서 null로 지적되지 않을 수도 있습니다 나. 294 00:24:53,470 --> 00:24:55,800 그들은 힙에 메모리를 가리키는 될 수 있습니다 295 00:24:55,800 --> 00:24:59,650 스택에 아마도 메모리. 296 00:24:59,650 --> 00:25:04,580 우리는 사실을 알고 있지만, 이러한 포인터 중 하나가 널 (null), 또는 무효 인 경우,하지 않습니다 297 00:25:04,580 --> 00:25:08,120 확실히 우리의 대여 기능을 중단하겠다 그. 298 00:25:08,120 --> 00:25:11,050 그 시험의 범위를 넘어 가지였다 것이었다. 299 00:25:11,050 --> 00:25:16,440 우리는 그것에 대해 걱정하지. 300 00:25:16,440 --> 00:25:22,170 좋아요. 좋아요. 그래서 퀴즈에서의 이동. 301 00:25:22,170 --> 00:25:25,760 >> 의이 남자를 가까이, 우리는 pset 4에서 보는거야. 302 00:25:25,760 --> 00:25:34,700 너희들이 pset 사양에 보면면 일단 당신이 그것을 액세스 할 수 cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 우리는 섹션 문제가 오늘날의 몇 가지를 통해 갈 수 있습니다. 304 00:25:42,730 --> 00:25:52,240 나는 아래로 스크롤거야 - 질문 섹션은 pset 사양의 세 번째 페이지에서 시작됩니다. 305 00:25:52,240 --> 00:25:57,800 그리고 첫 번째 부분은 리디렉션 및 파이프에 가서 짧은보고를 부탁합니다. 306 00:25:57,800 --> 00:26:02,820 시원한 짧은 사람 이었어요있는 당신에게 당신이 사용할 수있는 몇 가지 새로운, 멋진 명령 줄 트릭을 보여줍니다. 307 00:26:02,820 --> 00:26:06,050 그리고 우리는뿐만 아니라 당신을 위해 몇 가지 질문이 있어요. 308 00:26:06,050 --> 00:26:10,860 스트림에 대한 첫 번째 질문, printf 기본적으로 기록 할 수있는 309 00:26:10,860 --> 00:26:15,920 우리는 가지 좀 전에 조금 언급. 310 00:26:15,920 --> 00:26:22,380 우리가 토론 한 것을이 fprintf는 인자로 파일 * 스트림에 걸립니다. 311 00:26:22,380 --> 00:26:26,580 fclose는뿐만 아니라 파일 * 스트림에 소요 312 00:26:26,580 --> 00:26:32,660 그리고 fopen의 반환 값은뿐만 아니라 당신에게 파일 * 스트림을 제공합니다. 313 00:26:32,660 --> 00:26:36,060 우리가 printf 처리했을 때 우리가 전에 사람들을 보지 못하는 이유 314 00:26:36,060 --> 00:26:39,450 printf 기본 스트림이 때문입니다. 315 00:26:39,450 --> 00:26:41,810 그리고 기록 할 수있는 기본 스트림 316 00:26:41,810 --> 00:26:45,190 당신은 짧은에 대해 찾을 수 있습니다. 317 00:26:45,190 --> 00:26:50,080 그럼 확실히 한번 살펴보십시오. 318 00:26:50,080 --> 00:26:53,010 >> 오늘의 섹션에서, 우리는 GDB에 대해 조금 얘기를 할거야 319 00:26:53,010 --> 00:26:57,720 더 친숙 당신이 그 때문에, 더 연습 당신은 그것을 받아들 320 00:26:57,720 --> 00:27:01,390 더 나은 수 있습니다 당신은 실제로 자신의 코드에서 버그를 사냥 수 있습니다. 321 00:27:01,390 --> 00:27:05,540 이 엄청난까지 디버깅의 과정을 가속화시킵니다. 322 00:27:05,540 --> 00:27:09,230 따라서 printf를 사용하여 때마다 당신은, 당신은 코드를 다시 컴파일해야하는 일 323 00:27:09,230 --> 00:27:13,000 당신이 다시 실행해야 가끔 당신은 주변의 printf 전화를 이동해야 324 00:27:13,000 --> 00:27:17,100 코드를 주석으로, 단지 시간이 걸립니다. 325 00:27:17,100 --> 00:27:20,850 우리의 목표는 시도하고 GDB를 사용하면 기본적으로 할 수 있다는 것을 설득하는 것입니다 326 00:27:20,850 --> 00:27:26,810 printf 코드의 모든 시점에서 아무 것도 있고 당신이 그 사실을 다시 컴파일 할 필요가 없습니다. 327 00:27:26,810 --> 00:27:35,120 당신은 시작하고 어디에서 printf 다음도 추측 유지하지 않아도됩니다. 328 00:27:35,120 --> 00:27:40,910 해야 할 첫 번째 일은이 줄을 복사하여 웹의 섹션 코드를 하차하는 것입니다. 329 00:27:40,910 --> 00:27:47,530 난 "wget​​ http://cdn.cs50.net"라고 코드이 줄을 복사거야. 330 00:27:47,530 --> 00:27:49,510 난 복사 할거야. 331 00:27:49,510 --> 00:27:55,950 내 기기로 갈거야, 그래서 당신은, 내가하는 일이 볼 수 축소 332 00:27:55,950 --> 00:28:01,890 거기에 붙여, 나는 Enter 키를 쳤을 때이 wget 명령은 문자 그대로 웹 얻을 수 있습니다. 333 00:28:01,890 --> 00:28:06,210 그것은 인터넷의이 파일을 내리고 겁니다 334 00:28:06,210 --> 00:28:11,790 그리고 현재 디렉토리에 저장 거에요. 335 00:28:11,790 --> 00:28:21,630 내 현재 디렉토리를 나열하면 이제 바로 내가이 section5.zip 파일을 가지고있는 것으로 볼 수 있습니다. 336 00:28:21,630 --> 00:28:25,260 그 사람을 처리하는 방법은, 그것을 압축을 풉니하는 것입니다 337 00:28:25,260 --> 00:28:27,650 어떤 당신은 같이 명령 줄에 수행 할 수 있습니다. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 을 압축을 풉니 될거야, 저 폴더를 만듭니다 340 00:28:36,980 --> 00:28:40,410 내용을 모두 급증, 거기에 넣어. 341 00:28:40,410 --> 00:28:47,410 그래서 지금은 cd 명령을 사용하여 5 절 디렉토리로 이동 할 수 있습니다. 342 00:28:47,410 --> 00:28:58,310 맑은 사용하여 화면을 지 웁니다. 따라서 화면을 취소합니다. 343 00:28:58,310 --> 00:29:02,280 지금은 처리 할 수​​있는 좋은 깨끗한 터미널있어. 344 00:29:02,280 --> 00:29:06,200 >> 나는이 디렉토리에있는 모든 파일을 나열다면 지금이라도 345 00:29:06,200 --> 00:29:12,270 buggy1, buggy2, buggy3, 그리고 buggy4 : 내가 네 파일이있어 것을 볼 수 있습니다. 346 00:29:12,270 --> 00:29:16,180 나는 또한 해당. C 파일있어. 347 00:29:16,180 --> 00:29:20,400 우리는 지금. C 파일을 볼 수 없어요. 348 00:29:20,400 --> 00:29:24,140 대신, 우리는 GDB를 열 때를​​ 사용하려고하고 있습니다. 349 00:29:24,140 --> 00:29:28,220 우리는 GDB를 사용할 때 우리는 우리가 실제 소스 코드에 액세스 할 수 있도록 주변을 유지 한 350 00:29:28,220 --> 00:29:32,740 하지만 섹션의이 부분의 목표는 GDB와 주변 땜쟁이하는 것입니다 351 00:29:32,740 --> 00:29:40,370 우리는이 네 버그 프로그램을 통해 잘못 무슨 일인지 알아 내기 위해 사용할 수있는 방법을 참조하십시오. 352 00:29:40,370 --> 00:29:43,380 그래서 우리는 정말 신속하게 방 주위에가는거야 353 00:29:43,380 --> 00:29:47,000 그리고 난 버그 프로그램 중 하나를 실행 누군가를 요구하려고 354 00:29:47,000 --> 00:29:54,730 그리고, 우리는 GDB를 통해 그룹으로 갈거야, 그리고 우리가 이러한 프로그램을 해결하기 위해 할 수있는 일을 볼 수 있습니다 355 00:29:54,730 --> 00:29:58,460 아니면 적어도 그들 각각의 잘못된 무슨 식별합니다. 356 00:29:58,460 --> 00:30:04,760 다니엘과 함께 시작하자. 당신은 buggy1을 실행 되나요? 어떻게 알아 보자. 357 00:30:04,760 --> 00:30:09,470 [다니엘] 그것은 응용 프로그램 오류가 있다고 하는데요. >> 그래. 그렇지. 358 00:30:09,470 --> 00:30:12,460 나는 buggy1을 운영하는 경우 그래서, 난 감금 결함을. 359 00:30:12,460 --> 00:30:16,210 이 시점에서, 난 가서 buggy1.c을 열 수 360 00:30:16,210 --> 00:30:19,450 , 시도하고 잘못된 무슨 일인지 알아 내기 361 00:30:19,450 --> 00:30:22,000 하지만이 감금 오류 오류에 대한 가장 역겨운 것들 중 하나 362 00:30:22,000 --> 00:30:27,610 이 프로그램 일 줄은 실제로 잘못 가서 고장 내용에 얘기하지 않는다는 것입니다. 363 00:30:27,610 --> 00:30:29,880 당신은 가지 코드를 바라보아야 할 필요 364 00:30:29,880 --> 00:30:33,990 그리고 추측를 사용하여 파악하고 확인하거나 printf 잘못 무슨 일이 볼 수 있습니다. 365 00:30:33,990 --> 00:30:37,840 GDB에 대한 멋진 것들 중 하나는 정말, 정말 쉽다는 점입니다 366 00:30:37,840 --> 00:30:42,170 선을 찾아 낼 수있는 프로그램 충돌에서. 367 00:30:42,170 --> 00:30:46,160 그것은 완전히도 그에 대한 경우, 그것을 사용 가치가있어. 368 00:30:46,160 --> 00:30:56,190 그럼 GDB를 부팅하려면, 나는 GDB를 입력 한 다음 내가 실행하고자하는 실행에에게 경로를 제공합니다. 369 00:30:56,190 --> 00:31:01,960 난 여기 gdb를 ./buggy1을 입력거야. 370 00:31:01,960 --> 00:31:06,600 Enter 키를 누르십시오. 나에게 모든 저작권 정보를 제공합니다 371 00:31:06,600 --> 00:31:13,000 아래로 당신은 여기 ", / home에 /에서 읽기 기호를 말합니다이 줄을 볼 수 있습니다 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 모두가 잘 가면, 당신은 이런 식으로 보이는 메시지를 인쇄이 표시됩니다. 374 00:31:22,060 --> 00:31:25,500 그것은 기호를 읽을 것, 그것은 "나는 당신의 실행 파일에서 기호를 읽고있어"라고합니다 375 00:31:25,500 --> 00:31:29,900 다음은 여기에이 "완료"메시지가 있습니다. 376 00:31:29,900 --> 00:31:35,410 이 중 다른 변화를 참조하거나 당신이 볼 경우에는 기호를 찾을 수 없습니다 377 00:31:35,410 --> 00:31:41,460 또는 그런 일을, 뭘 의미하는 것은 당신이 방금 제대로 실행 파일을 컴파일하지 않은 것입니다. 378 00:31:41,460 --> 00:31:49,980 우리는 GDB와 함께 사용하기위한 프로그램을 컴파일 할 때, 우리는 그 특수 g 플래그를 사용해야합니다 379 00:31:49,980 --> 00:31:54,540 당신이 프로그램을 컴파일하는 경우와 그건 그냥 확인 입력하여 기본적으로 끝났 380 00:31:54,540 --> 00:31:59,320 또는 버그를 걸거나 그 중 어느 복구합니다. 381 00:31:59,320 --> 00:32:07,800 하지만 당신이 꽝을 수동으로 컴파일하는 경우, 당신은에 가서 그 - g 플래그를 포함해야합니다. 382 00:32:07,800 --> 00:32:10,310 >> 이 시점에서, 이제 우리는 우리의 GDB 프롬프트를 가지고 383 00:32:10,310 --> 00:32:12,310 이 프로그램을 실행하기 위해 아주 간단합니다. 384 00:32:12,310 --> 00:32:19,740 우리는 하나 실행을 입력 할 수 있습니다, 또는 우리는 R을 입력 할 수 있습니다. 385 00:32:19,740 --> 00:32:22,820 대부분의 GDB 명령은 생략 할 수 있습니다. 386 00:32:22,820 --> 00:32:25,940 보통 꽤 좋아 하나 또는 몇 문자로. 387 00:32:25,940 --> 00:32:30,980 당신은 r을 입력하고 무슨 일이, Enter 키를다면, 사드? 388 00:32:30,980 --> 00:32:39,390 [사드] 내가 SIGSEGV, 분류 오류, 그리고이 모든 어려운 있어요. 389 00:32:39,390 --> 00:32:43,650 >> 그래. 390 00:32:43,650 --> 00:32:47,990 지금 우리가 화면에 표시하는 것, 그리고 사드 말씀 드렸듯이, 391 00:32:47,990 --> 00:32:53,430 우리가 실행 또는 r을 입력하고 Enter를 누르 때, 우리는 여전히 같은 감금 오류를 얻을. 392 00:32:53,430 --> 00:32:55,830 그럼 GDB를 사용하는 것은 우리의 문제가 해결되지 않습니다. 393 00:32:55,830 --> 00:32:59,120 그러나 우리에게 어려운를 부여하며 밝혀 그이 어려운 394 00:32:59,120 --> 00:33:03,080 가 일어나는 곳 실제로 우리에게 알려줍니다. 395 00:33:03,080 --> 00:33:10,680 이 조금 구문 분석하려면 첫 번째 비트는 모든 잘못이야하는 기능입니다. 396 00:33:10,680 --> 00:33:20,270 가이 __ strcmp_sse4_2은, 그리고 그것이이 파일에 무슨 일이 우리에게 알려줍니다 397 00:33:20,270 --> 00:33:29,450 sysdeps/i386 불리는이, 다시 엉망 종류의 -하지만 선 254. 398 00:33:29,450 --> 00:33:31,670 그런 구문 분석 가지 어렵습니다. 당신은 이런 짓을 볼 때 보통 399 00:33:31,670 --> 00:33:38,770 그 방법은 우리가 시스템 라이브러리 중 하나에 오류있는 독방 감금 있다는 것을 의미합니다. 400 00:33:38,770 --> 00:33:43,220 그럼 뭔가 strcmp와해야 할 일. 당신들은 전에 strcmp를 보았다. 401 00:33:43,220 --> 00:33:52,730 미친 짓,하지만이 strcmp는 strcmp에 문제가 있다는 깨거나 있다는 뜻입니까? 402 00:33:52,730 --> 00:33:57,110 당신은 알렉산더를 어떻게 생각하십니까? 403 00:33:57,110 --> 00:34:04,890 [알렉산더]인가 - 254 선입니까? 그리고 -이 아닌 이진 않지만 자신의 천장 아니라, 404 00:34:04,890 --> 00:34:10,590 다음 각 기능에 대한 다른 언어가 있습니다. - 그건 그 함수에서 254, 또는입니까? 405 00:34:10,590 --> 00:34:21,460 >>이 줄 254입니다. 그것은이.의 파일에있는 것 같은데 아마도이의 어셈블리 코드 때문에. 406 00:34:21,460 --> 00:34:25,949 >> 그러나, 우리가 감금 결함을 늘어 놓던 때문에 더 중요한 문제는, 것 같네요 407 00:34:25,949 --> 00:34:29,960 하고 strcmp 함수에서 올 것 같은데, 408 00:34:29,960 --> 00:34:38,030 이 의미 않으며, 다음, 해당 strcmp가 고장 났어요? 409 00:34:38,030 --> 00:34:42,290 그것은 바라건대, 안돼. 당신은 세분화 결함을 가지고 있으므로해서 410 00:34:42,290 --> 00:34:49,480 시스템 기능 중 하나에서 일반적으로 그것이 당신이 방금 올바르게 호출하지 않은 것을 의미합니다. 411 00:34:49,480 --> 00:34:52,440 무슨 일이 실제로 무슨 일이야 알아내는 제일 빠른 방법 412 00:34:52,440 --> 00:34:55,500 당신이 감금 결함을 볼 때마다이 같은 미친 짓을 볼 때, 413 00:34:55,500 --> 00:34:59,800 당신은 더 이상 단지 기본을 사용하고있는 프로그램이 특히 414 00:34:59,800 --> 00:35:03,570 추적 (backtrace)를 사용하는 것입니다. 415 00:35:03,570 --> 00:35:13,080 나는 전체 추적 (backtrace) 단어 반대로, BT를 작성하여 역 추적을 생략. 416 00:35:13,080 --> 00:35:16,510 그러나 샬롯, 당신은 BT를 입력하고 조회가 입력되면 어떻게 되겠습니까? 417 00:35:16,510 --> 00:35:23,200 [샬롯] 그것은 나에게 두 줄, 줄 0과 1 호선을 보여줍니다. 418 00:35:23,200 --> 00:35:26,150 >> 그래. 그러니까 줄 0과 1 호선. 419 00:35:26,150 --> 00:35:34,560 다음은 프로그램이 작동을 중지했을 때 놀이에 현재 있던 실제 스택 프레임입니다. 420 00:35:34,560 --> 00:35:42,230 맨 위 프레임, 프레임 0에서 시작하고, 프레임 1있는 가장 아래로 이동. 421 00:35:42,230 --> 00:35:45,140 우리 최상위 프레임은 strcmp 프레임입니다. 422 00:35:45,140 --> 00:35:50,080 당신이에 우리가 포인터와 퀴즈에서 뭘했는데 그 문제에와 유사한 생각할 수 423 00:35:50,080 --> 00:35:54,890 어디에서 우리는 주요 스택 프레임의 상단에 스택 프레임을 교환 한 424 00:35:54,890 --> 00:35:59,700 우리는 스왑 주요 사용하던 변수의 상단에 사용하던 변수를했다. 425 00:35:59,700 --> 00:36:08,440 다음은 충돌은 우리의 주요 기능에 의해 호출 된 우리 strcmp 함수에 일 426 00:36:08,440 --> 00:36:14,370 및 추적 (backtrace) 우리에게 일들이 실패하는 기능뿐만 아니라 제공되며, 427 00:36:14,370 --> 00:36:16,440 모든 것이에서 호출 된 곳뿐만 아니라 우리를 말하고 있어요. 428 00:36:16,440 --> 00:36:18,830 나는 오른쪽으로 조금 더 이상 스크롤면 429 00:36:18,830 --> 00:36:26,110 우리는 예, 우리가이 strcmp - sse4.s 파일의 라인 254에 있다고 볼 수 있습니다. 430 00:36:26,110 --> 00:36:32,540 그러나 전화가 buggy1.c, 선 6되었다. 431 00:36:32,540 --> 00:36:35,960 우리는 확인하고, 무슨 일이 있었는지 보러 수있다 - 우리가 할 수있는 것을 의미하므로 432 00:36:35,960 --> 00:36:39,930 buggy1.c 줄 6 개. 433 00:36:39,930 --> 00:36:43,780 다시 말하지만,이 작업을 수행 할 수있는 몇 가지 방법이 있습니다. 하나는 GDB에서 종료하는 것입니다 434 00:36:43,780 --> 00:36:49,460 또는 코드가 다른 창 및 상호 참조에서 열 수 있습니다. 435 00:36:49,460 --> 00:36:54,740 이제 근무 시간에 있으면 때문에 자체의 아주 편리합니다 436 00:36:54,740 --> 00:36:57,220 그리고 당신은 감금 결함이있어 모든이 밝아 위치에 TF가 궁금해 437 00:36:57,220 --> 00:36:59,710 당신은 "아, 6 호선 말할 수 있습니다. 내 말은, 무슨 일이 일어나고 있었는지 몰랐어 438 00:36:59,710 --> 00:37:03,670 하지만 6 호선에 대해 뭔가 내 프로그램이 부러 원인이다. " 439 00:37:03,670 --> 00:37:10,430 할 수있는 다른 방법은 GDB에서 목록이라는 명령을 사용할 수 있습니다. 440 00:37:10,430 --> 00:37:13,650 당신은 또한 리터로 생략 할 수 있습니다. 441 00:37:13,650 --> 00:37:18,910 우리가 나도 친다면 그럼, 우리가 여기서 무슨 일을 어떻게해야합니까? 442 00:37:18,910 --> 00:37:21,160 우리는 이상한 물건을 왕창를. 443 00:37:21,160 --> 00:37:26,030 이것은 실제 어셈블리 코드입니다 444 00:37:26,030 --> 00:37:29,860 그 strcmp_sse4_2에 있습니다. 445 00:37:29,860 --> 00:37:32,440 이것은 펑키의 종류를 보인다 446 00:37:32,440 --> 00:37:36,520 그리고 우리가이 발생하는 이유는 지금 당장 때문입니다 447 00:37:36,520 --> 00:37:40,160 GDB는 프레임 0에서 우리가 있습니다. 448 00:37:40,160 --> 00:37:43,070 >> 그럼 언제 우리가 볼 변수에서, 우리는 소스 코드를보고 어떤 시간, 449 00:37:43,070 --> 00:37:50,530 우리는 스택 프레임에 관련된 우리가 들어 현재 걸 소스 코드를보고 450 00:37:50,530 --> 00:37:53,200 따라서 의미있는 뭔가를하기 위해, 우리는해야 451 00:37:53,200 --> 00:37:57,070 더 많은 의미가 스택 프레임으로 이동합니다. 452 00:37:57,070 --> 00:38:00,180 이 경우, 주 스택 프레임은 좀 더 나을 거 453 00:38:00,180 --> 00:38:02,680 그 사실은 우리가 신조 때문입니다. 454 00:38:02,680 --> 00:38:05,330 하지 strcmp 코드입니다. 455 00:38:05,330 --> 00:38:08,650 우리가 두 가지고 있기 때문에,이 경우에는, 프레임 사이를 이동 할 수있는 방법 456 00:38:08,650 --> 00:38:10,430 우리는 0과 1이 457 00:38:10,430 --> 00:38:13,650 당신은 위 아래 명령으로 그 해. 458 00:38:13,650 --> 00:38:18,480 한 프레임을 위로 이동하는 경우 459 00:38:18,480 --> 00:38:21,770 지금은 기본 스택 프레임에있어. 460 00:38:21,770 --> 00:38:24,330 내가있는 곳으로 돌아가 아래로 이동할 수 있습니다 461 00:38:24,330 --> 00:38:32,830 다시 가서 다시 내려 가고, 다시 이동합니다. 462 00:38:32,830 --> 00:38:39,750 지금까지 GDB에서 프로그램을 할 경우에는 충돌이 발생하게됩니다, 당신은 역 추적을 463 00:38:39,750 --> 00:38:42,380 당신은 당신이 무슨 일이 일어나고 있는지 알지 못하는 일부 파일에 것을 볼 수 있습니다. 464 00:38:42,380 --> 00:38:45,460 당신이 목록을보십시오 코드는 당신에게 잘 보이지 않는다 465 00:38:45,460 --> 00:38:48,150 귀하의 프레임에서 살펴보고 당신이 어디에 알아 봅시다. 466 00:38:48,150 --> 00:38:51,010 당신이 잘못 스택 프레임에있을 거예요. 467 00:38:51,010 --> 00:38:58,760 적어도 당신이 정말로 디버깅 할 수있는 사람이 아니 스택 프레임에 있어요. 468 00:38:58,760 --> 00:39:03,110 이제 우리는 적절한 스택 프레임에 있으니, 우리는 메인에 있어요 469 00:39:03,110 --> 00:39:08,100 지금 우리는 선이 뭔지 알아 내려고 목록 명령을 사용할 수 있습니다. 470 00:39:08,100 --> 00:39:13,590 그리고 당신은 그것을 볼 수 있으며 바로 여기에 우리를 출력한다. 471 00:39:13,590 --> 00:39:19,470 그러나 우리는 모두 같은 목록을 공격 할 수 있으며, 목록은 우리에게 좋은 출력을 제공합니다 472 00:39:19,470 --> 00:39:23,920 여기에 무슨 일 실제 소스 코드. 473 00:39:23,920 --> 00:39:26,420 >> 특히, 우리는 6 호선 볼 수 있습니다. 474 00:39:26,420 --> 00:39:29,330 우리는 여기서 무슨 일이 일어나고 있는지 볼 수 있습니다. 475 00:39:29,330 --> 00:39:31,250 우리는 문자열 비교를하고 있는거야 것 같아 476 00:39:31,250 --> 00:39:41,050 문자열 "CS50 바위"와 argv가 사이 [1]. 477 00:39:41,050 --> 00:39:45,700 이것에 대해 뭔가가 충돌했습니다. 478 00:39:45,700 --> 00:39:54,120 미시 그래서, 여기 무슨 일이 될 수에 대한 생각을해야합니까? 479 00:39:54,120 --> 00:39:59,400 [미시]가 의식을 잃고있어 이유를 모르겠어요. 이 충돌 왜 >> 당신은 몰라요? 480 00:39:59,400 --> 00:40:02,700 지미, 어떤 생각? 481 00:40:02,700 --> 00:40:06,240 [지미] 나는 잘 모르겠어요,하지만 우리가 문자열을 마지막으로 사용한 시간 비교 482 00:40:06,240 --> 00:40:10,260 또는 strcmp, 우리는 그 아래 세 가지 다른 사건들처럼했다. 483 00:40:10,260 --> 00:40:12,800 우리는 ==이 없었, 바로 그 첫 번째 줄에, 생각하지 마. 484 00:40:12,800 --> 00:40:16,700 대신, 3으로 나누어, 하나는 == 0였습니다 485 00:40:16,700 --> 00:40:19,910 하나는 <0, 내 생각 엔, 그리고 하나였다> 0. 486 00:40:19,910 --> 00:40:22,590 그런 식으로 아마 뭔가? >> 그래. 그래서이 문제가 487 00:40:22,590 --> 00:40:27,200 의 우리는 올바르게 비교하는거야? 488 00:40:27,200 --> 00:40:31,660 스텔라? 어떤 생각? 489 00:40:31,660 --> 00:40:38,110 [스텔라] 내가 모르겠어. >> 확실하지. 다니엘? 생각? 좋아요. 490 00:40:38,110 --> 00:40:44,770 우리가 프로그램을 실행할 때 무슨 권리로 여기 무슨 일 것은 밝혀 491 00:40:44,770 --> 00:40:48,370 당신이 처음 프로그램 다니엘을했을 때 우리는, 감금 잘못을 가지고 492 00:40:48,370 --> 00:40:50,800 당신이 어떤 명령 줄 인수를 줬나요? 493 00:40:50,800 --> 00:40:58,420 [다니엘] 번호 >> 번호 이 경우 변수는 argv의 값이 무엇 [1]?주세요 494 00:40:58,420 --> 00:41:00,920 >> 더 값이 없습니다. >>이 맞아. 495 00:41:00,920 --> 00:41:06,120 음, 적절한 문자열 값이 없습니다. 496 00:41:06,120 --> 00:41:10,780 그러나 어떤 값이 있습니다. 거기에 저장됩니다 값은 무엇입니까? 497 00:41:10,780 --> 00:41:15,130 >> 쓰레기 값? 그것은이 경우에는 쓰레기 값이 아니면 >> 498 00:41:15,130 --> 00:41:19,930 변수는 argv 배열의 끝은 항상 널 (null)로 종료됩니다. 499 00:41:19,930 --> 00:41:26,050 그래서 실제로에 저장 했어요은 널 (null)이 있습니다. 500 00:41:26,050 --> 00:41:30,810 다른 방법은, 오히려 그것을 통해 생각보다 이러한 문제를 해결하기 위해 501 00:41:30,810 --> 00:41:33,420 을 출력하는 것입니다. 502 00:41:33,420 --> 00:41:35,880 내 말은, GDB를 사용하여 좋은 것을 말한 곳입니다 503 00:41:35,880 --> 00:41:40,640 당신이 원하는 당신은 모든 변수를 인쇄 할 수 있기 때문에, 모든 값 504 00:41:40,640 --> 00:41:43,230 이 편리한 - 멋쟁이 p 명령을 사용합니다. 505 00:41:43,230 --> 00:41:48,520 나는 P를 입력하면 그래서 나는 변수 또는 변수의 이름의 값을 입력 506 00:41:48,520 --> 00:41:55,320 , argc을 말하면, 내가 argc는 1 것을 볼 수 있습니다. 507 00:41:55,320 --> 00:42:01,830 나는 변수는 argv를 인쇄하려면 [0], 그냥 그런 식으로 할 수 있습니다. 508 00:42:01,830 --> 00:42:04,840 그리고 우리가 본 것처럼, 변수는 argv [0] 항상 프로그램의 이름입니다, 509 00:42:04,840 --> 00:42:06,910 항상 실행 파일의 이름입니다. 510 00:42:06,910 --> 00:42:09,740 여기가 전체 경로 이름을 가지고 참조하십시오. 511 00:42:09,740 --> 00:42:15,920 또 인쇄 할 수 있습니다 argv가 [1] 무슨 일이 일어나는지를 참조하십시오.주세요 512 00:42:15,920 --> 00:42:20,890 >> 여기 신비로운 가치의 종류를 가지고. 513 00:42:20,890 --> 00:42:23,890 우리는이 0x0 있어요. 514 00:42:23,890 --> 00:42:27,850 우리가 16 진수에 대해 얘기 학기의 시작 부분에서 기억 나? 515 00:42:27,850 --> 00:42:34,680 또는 헥스에 50를 나타냅니다하는 방법에 대한 pset 0 말에 그 작은 질문? 516 00:42:34,680 --> 00:42:39,410 우리가 CS의 진수 숫자를 쓸 방법은 그냥 우리 자신을 혼동하지하는 517 00:42:39,410 --> 00:42:46,080 소수점 숫자로, 우리는 항상 0x로를 접두사입니다. 518 00:42:46,080 --> 00:42:51,420 그래서이 0x 접두사는 항상, 16 진수로 다음과 같은 숫자를 해석 의미 519 00:42:51,420 --> 00:42:57,400 아닌 문자열로가 아닌 10 진수로가 아닌 이진수 있습니다. 520 00:42:57,400 --> 00:43:02,820 숫자 5-0는 16 진수로 유효한 숫자 때문입니다. 521 00:43:02,820 --> 00:43:06,240 그리고 진수, 50의 숫자입니다. 522 00:43:06,240 --> 00:43:10,050 그래서 우리가 disambiguate 단지 방법입니다. 523 00:43:10,050 --> 00:43:14,860 따라서도 공 십진수입니다 0x0 수단 진수 0,, 이진 0. 524 00:43:14,860 --> 00:43:17,030 단지 값 0입니다. 525 00:43:17,030 --> 00:43:22,630 그것은이가 null가 메모리에, 사실은 무엇인지 밝혀졌다. 526 00:43:22,630 --> 00:43:25,940 널은 0입니다. 527 00:43:25,940 --> 00:43:37,010 여기 요소는 [1]가 null이 변수는 argv에 저장됩니다. 528 00:43:37,010 --> 00:43:45,220 그래서 우리는 널 (null) 문자열로 우리의 "CS50 바위"문자열을 비교하는 중입니다. 529 00:43:45,220 --> 00:43:48,130 따라서 null을 dereferencing, 널에서 물건을 액세스하려고, 530 00:43:48,130 --> 00:43:55,050 이러한은 일반적으로 세그먼트 오류 또는 발생할 수있는 다른 나쁜 일이 어떤 종류의 원인이 갈 수 있습니다. 531 00:43:55,050 --> 00:43:59,350 그리고 strcmp는 확인하지 않습니다 판명 532 00:43:59,350 --> 00:44:04,340 당신은 null이 있어요 값에 통과 한 여부. 533 00:44:04,340 --> 00:44:06,370 오히려, 그냥 앞서가는, 그 일을하려고 534 00:44:06,370 --> 00:44:14,640 이 오류를 감금되면, 그 결함을 감금하고, 귀하의 문제 야. 당신은 문제를 해결 가야 해. 535 00:44:14,640 --> 00:44:19,730 정말 빠르게, 우리는이 문제를 어떻게 해결할까요? 샬롯? 536 00:44:19,730 --> 00:44:23,540 [샬롯] 당신은 경우에 사용 확인할 수 있습니다. 537 00:44:23,540 --> 00:44:32,240 그래서, 만약 변수는 argv [1] Null입니다, == 0, 다음 1을 반환, 또는 무언가 불륜]. 538 00:44:32,240 --> 00:44:34,590 >> 그래. 그럼 우리가 확인할 수 있습니다으로 할 수있는 멋진 방법 539 00:44:34,590 --> 00:44:39,230 우리가 strcmp을 통과 할 겁니다 값은 변수는 argv [1]은 null입니다? 540 00:44:39,230 --> 00:44:45,830 그게 널 (null) 경우, 우리는 중지를 알았다고 할 수 있습니다. 541 00:44:45,830 --> 00:44:49,450 >> 이 작업을 수행하는보다 일반적인 방법은 argc 값을 사용하는 것입니다. 542 00:44:49,450 --> 00:44:52,040 당신은, 메인의 시작 부분에서 바로 볼 수 543 00:44:52,040 --> 00:44:58,040 우리는 우리가 명령 줄 인수를 사용할 때 우리가 일반적으로 수행하는 첫 번째 테스트를 생략 544 00:44:58,040 --> 00:45:05,240 이는 우리 argc 값이 우리가 기대하는 게 뭔지 여부를 테스트하는 것입니다. 545 00:45:05,240 --> 00:45:10,290 이 경우, 우리는 적어도 두 개의 인수를 기대하는 546 00:45:10,290 --> 00:45:13,660 프로그램의 이름을 더하기 다른 사람. 547 00:45:13,660 --> 00:45:17,140 우리는 여기에 두 번째 인수를 사용하려는거야. 548 00:45:17,140 --> 00:45:21,350 그럼 우리 strcmp 전화하기 전에 미리 테스트의 일종을 갖는 549 00:45:21,350 --> 00:45:37,390 변수는 argv은 적어도 2할지 여부를 그 시험도 일 이와 같은 작업을 수행합니다. 550 00:45:37,390 --> 00:45:40,620 그 프로그램을 다시 실행하여 작동하는지 우리는 볼 수 있습니다. 551 00:45:40,620 --> 00:45:45,610 당신은 언제나 정말 좋은 GDB, 내 프로그램을 다시 시작할 수 있습니다. 552 00:45:45,610 --> 00:45:49,310 , 당신은 실행할 수 있으며, 귀하의 프로그램에 인수로 전달할 때 553 00:45:49,310 --> 00:45:53,060 당신은 GDB를 부팅 할 때, 귀하가 실행 한 호출 할 때 전달한 없습니다. 554 00:45:53,060 --> 00:45:57,120 이렇게하면 다른 인수와 함께 때마다 프로그램을 호출 할 수 있습니다. 555 00:45:57,120 --> 00:46:08,080 따라서 실행하거나 다시, 나는 r을 입력 할 수 있으며, 우리가 입력하면 어떤 '안녕하세요'어떻게 볼까 있어요. 556 00:46:08,080 --> 00:46:11,140 다시 처음부터 그것을 시작하려는 경우 그것은 항상 당신을 물어볼 것입니다. 557 00:46:11,140 --> 00:46:17,490 보통, 당신은 처음부터 다시 그것을 시작하고 싶어. 558 00:46:17,490 --> 00:46:25,010 그리고이 시점에서, 그것은 다시 시작은 다시, 그것은 출력 559 00:46:25,010 --> 00:46:28,920 우리가 인수 인사 만하고, buggy1를 실행하고있는 프로그램 560 00:46:28,920 --> 00:46:32,720 그리고이 표준 아웃을 인쇄, 그것은 슬픈 얼굴을 "당신은 D를"말한다. 561 00:46:32,720 --> 00:46:37,610 그러나 우리는 잘못을 감금 없습니다. 이 과정이 정상적으로 종료했다. 562 00:46:37,610 --> 00:46:39,900 그래서 아주 잘 보입니다. 563 00:46:39,900 --> 00:46:43,050 더 이상 감금 결함, 우리는이 과거하지 564 00:46:43,050 --> 00:46:48,190 그 실제로 우리가 점점 있다고 감금 결함 버그처럼 있으므로 같습니다. 565 00:46:48,190 --> 00:46:51,540 불행하게도, 우리가 D.을 받고있는 걸 알 수 566 00:46:51,540 --> 00:46:54,090 >> 우리는 돌아가서 코드를보고 거기에 무슨 일이 있었는지 확인할 수 있습니다 567 00:46:54,090 --> 00:46:57,980 어떻게 된 건지 알아 냈어합니다 - 우리가 D.도했다는 이유 568 00:46:57,980 --> 00:47:03,690 이 printf 당신이 D.도한다는 봅시다, 여기를했습니다 569 00:47:03,690 --> 00:47:08,540 우리가 목록을 입력하면 입력 목록을 삭제하지 않는 한, 그것은 당신의 프로그램을 통해 다운 반복 유지 570 00:47:08,540 --> 00:47:10,940 그래서 귀하의 프로그램의 처음 몇 줄을 표시됩니다. 571 00:47:10,940 --> 00:47:15,450 그런 다음 당신에게 몇 라인, 다음 청크와 다음 덩어리가 표시됩니다. 572 00:47:15,450 --> 00:47:18,240 그리고 내려 노력하겠습니다. 573 00:47:18,240 --> 00:47:21,180 그리고 지금 우리는 "숫자 16 범위를 벗어 줄을."할 게요 574 00:47:21,180 --> 00:47:23,940 이 15 라인이 때문입니다. 575 00:47:23,940 --> 00:47:30,310 이 지점에 도착하고는 "내가 무엇을해야합니까?"궁금해하는 경우 당신은 도움말 명령을 사용할 수 있습니다. 576 00:47:30,310 --> 00:47:34,340 도움이 다음에게 명령의 이름을 사용합니다. 577 00:47:34,340 --> 00:47:36,460 그리고 당신은 GDB이 우리에게 일들이 모든 종류를 제공합니다 참조하십시오. 578 00:47:36,460 --> 00:47:43,870 그것은 "아니오 인수를 통해 이전 목록 다음 또는 주변의 10 년은 더 행을 나열 말합니다. 579 00:47:43,870 --> 00:47:47,920 목록 - 전에 10 라인을 보여줍니다 - " 580 00:47:47,920 --> 00:47:52,960 그러니 목록 마이너스를 사용하여 봅시다. 581 00:47:52,960 --> 00:47:57,000 그리고 그 10 라인 이전 목록, 당​​신은 목록을 조금 주변을 재생할 수 있습니다. 582 00:47:57,000 --> 00:48:02,330 당신은 목록, 목록을 할 수 - 당신은 심지어, 목록 8과 같이 나열에게 번호를 부여 할 수 있습니다 583 00:48:02,330 --> 00:48:07,500 그리고 8 호선 주변에 10 줄을 표시됩니다. 584 00:48:07,500 --> 00:48:10,290 이 경우 다른 간단한이있어 그리고 당신은 무슨 일이 일어나고 있는지 볼 수 있습니다. 585 00:48:10,290 --> 00:48:13,980 당신은 CS50 바위에 입력하면 "당신은 A.를"출력 586 00:48:13,980 --> 00:48:16,530 그렇지 않으면 "당신은 D.를"출력 587 00:48:16,530 --> 00:48:23,770 부랑자 마을. 괜찮아요. 그래? 588 00:48:23,770 --> 00:48:26,730 >> [다니엘] 그래서 따옴표를 쓰지 않고 CS50 돌을 다하고하려고 할 때, 589 00:48:26,730 --> 00:48:29,290 는 "당신은 D.를"라는 590 00:48:29,290 --> 00:48:32,560 나는 작동하도록하는 따옴표가 필요, 이유는? 591 00:48:32,560 --> 00:48:38,490 >> 그래. 그것은 밝혀 그 때 -이 또 다른 재미를 조금 재미있는 이야기입니다 - 592 00:48:38,490 --> 00:48:47,900 우리가 그것을 실행하는 경우이 프로그램을 실행하고 우리가 CS50 바위에 입력 할 때, 593 00:48:47,900 --> 00:48:50,800 처럼 다니엘은 그가 한 말했듯이, 당신은 Enter 키를 누르 594 00:48:50,800 --> 00:48:52,870 그것은 여전히​​ 우리가 D.를 말한다 595 00:48:52,870 --> 00:48:55,580 그리고 질문은, 왜이 있습니다? 596 00:48:55,580 --> 00:49:02,120 그리고 우리의 터미널과 GDB 모두이 두 개의 인자를 구문 분석을 이용할 수 있습니다. 597 00:49:02,120 --> 00:49:04,800 로 숨겨져있는 공간이,이 때 때문에 598 00:49:04,800 --> 00:49:08,730 첫 번째 인자는 끝, 다음 인수는 시작됐다. 599 00:49:08,730 --> 00:49:13,260 둘 다 사람들을 결합 할 수있는 방법, 또는 해요, 인수로, 600 00:49:13,260 --> 00:49:18,510 따옴표를 사용하는 것입니다. 601 00:49:18,510 --> 00:49:29,560 우리가 따옴표를 다시 실행하면 이제, 우리는 A.을 602 00:49:29,560 --> 00:49:38,780 그냥 요점을 되풀이하기 위해 따옴표, CS50 바위는 두 별도의 인자로 해석되지 않습니다. 603 00:49:38,780 --> 00:49:45,320 따옴표로, 그것은 모두 하나의 인자로 파싱있어. 604 00:49:45,320 --> 00:49:53,070 >> 우리는 중단 점을이을 볼 수 있습니다. 605 00:49:53,070 --> 00:49:54,920 지금까지 우리는 우리의 프로그램을 실행 봤는데, 그것은 실행 된 606 00:49:54,920 --> 00:49:58,230 하나는 결함이나 히트에게 오류를 감금까지 607 00:49:58,230 --> 00:50:05,930 하거나 종료하고 모든 완전히 괜찮을 때까지. 608 00:50:05,930 --> 00:50:08,360 때때로 때문, 반드시 가장 유용한 것은 아닙니다 609 00:50:08,360 --> 00:50:11,840 귀하의 프로그램에 오류가 있지만 분류 결함의 원인이 없어. 610 00:50:11,840 --> 00:50:16,950 당신 멈출 프로그램이나 그 비슷한 범죄를 일으키지 않아. 611 00:50:16,950 --> 00:50:20,730 프로그램이 특정 시점에서 일시 중지 GDB를 얻을 수 방법 612 00:50:20,730 --> 00:50:23,260 중단 점을 설정하는 것입니다. 613 00:50:23,260 --> 00:50:26,520 여러분은 함수 이름에 중단 점을 설정하여이 작업을 수행 할 수 있습니다 614 00:50:26,520 --> 00:50:30,770 또는 코드의 특정 줄에 중단 점을 설정할 수 있습니다. 615 00:50:30,770 --> 00:50:34,450 기억하기 쉬운 - 때문에, 함수 이름에 중단 점을 설정하려면 616 00:50:34,450 --> 00:50:37,700 당신이 실제로에 가서 약간의 백업 소스 코드를 변경하는 경우, 617 00:50:37,700 --> 00:50:42,020 다음 정지 점은 실제로 당신의 코드 내에서 같은 장소에서 남아있을 것입니다. 618 00:50:42,020 --> 00:50:44,760 반면에 당신은 줄 번호를 사용하고, 줄 번호가 변경하는 경우 619 00:50:44,760 --> 00:50:51,740 당신은 몇 가지 코드를 추가하거나 삭제할 때문에, 다음 중단 점은 모두 망쳐 있습니다. 620 00:50:51,740 --> 00:50:58,590 제가 가장 일반적인 것들 중 하나는 main () 함수에 중단 점을 설정합니다. 621 00:50:58,590 --> 00:51:05,300 자주 GDB를 부팅거야, Enter 키를 누르, B 주를 입력거야, 그리고 그 중단 점을 설정합니다 622 00:51:05,300 --> 00:51:10,630 단지라는 기본 기능에, "가능한 빨리 실행을 시작으로 프로그램을 일시 중지" 623 00:51:10,630 --> 00:51:17,960 그 방법으로, 나는 같이 CS50 바위, 말과 내 프로그램을 실행 두 개의 인수 624 00:51:17,960 --> 00:51:24,830 그리고 Enter 키를,이 main () 함수에 도달하고 바로 첫 줄에서 중지 625 00:51:24,830 --> 00:51:30,620 그것은 strcmp 기능을 평가 직전에. 626 00:51:30,620 --> 00:51:34,940 >> I가 일시 중지되어 있기 때문에, 지금은 주변 청소 하는건 및 무슨보고를 시작할 수 있습니다 627 00:51:34,940 --> 00:51:40,250 내 프로그램으로 전달되는 다른 모든 변수가 있습니다. 628 00:51:40,250 --> 00:51:43,670 난 여기 argc를 인쇄 무슨 일이 일어나고 있는지 볼 수 있습니다. 629 00:51:43,670 --> 00:51:50,030 그 안에 3 개의 값을 가지고 있기 때문에 argc의이 3 것을 볼 수 있습니다. 630 00:51:50,030 --> 00:51:54,060 이것은 프로그램의 이름을 가지고, 그것은 첫 번째 인수와 두 번째 인수 있어요. 631 00:51:54,060 --> 00:52:09,330 우리는 argv가보고들을 인쇄 할 수 있습니다 [0], argv가 [1], 그리고 변수는 argv [2]. 632 00:52:09,330 --> 00:52:12,030 이 strcmp 통화 실패 할 것이다 그래서 지금 당신은 또한 볼 수 있습니다 633 00:52:12,030 --> 00:52:21,650 당신은 두 개의 별도의 인수로 CS50과 바위를 분할 않았다는 걸 알 때문입니다. 634 00:52:21,650 --> 00:52:27,250 당신은 중단 점을 치 한 후이 시점에서, 당신은 프로그램을 통해 단계로 계속 635 00:52:27,250 --> 00:52:32,920 선으로 선으로 다시 프로그램을 시작하기에 반대했다. 636 00:52:32,920 --> 00:52:35,520 다시하고 당신의 프로그램을 시작하지 않으려면 그럼, 여기에서의 계속 637 00:52:35,520 --> 00:52:41,970 당신은 계속 명령을 사용할 수 있으며 계속은 끝으로 프로그램을 실행합니다. 638 00:52:41,970 --> 00:52:45,010 그냥 여기 그랬던 것처럼. 639 00:52:45,010 --> 00:52:54,880 나는 프로그램 CS50 바위를 다시 시작하는 경우에는, 그것은 다시 내 중단 점에 도달 640 00:52:54,880 --> 00:52:59,670 이 시간은, 경우, 프로그램의 나머지 부분을 통해 모든 방법을 그냥 가고 싶지 않아 641 00:52:59,670 --> 00:53:08,040 나는 또한 N과 생략 다음 명령을 사용할 수 있습니다. 642 00:53:08,040 --> 00:53:12,960 그리고이 줄하여 프로그램 라인을 통해 단계 것입니다. 643 00:53:12,960 --> 00:53:17,530 일 실행으로 그래서 당신은 일 업데이트받을으로 같은 변수의 변화를 볼 수 있습니다. 644 00:53:17,530 --> 00:53:21,550 어떤 아주 좋은 것입니다. 645 00:53:21,550 --> 00:53:26,570 다른 좋은 점은, 오히려 다시 이상 이상 이상 같은 명령을 반복보다입니다 646 00:53:26,570 --> 00:53:30,670 방금 입력을 친다면 - 그럼 당신은 내가 아무 것도 입력하지 않았어요 - 647 00:53:30,670 --> 00:53:33,780 난 그냥 Enter 키를한다면, 그것은, 이전 명령을 반복합니다 648 00:53:33,780 --> 00:53:36,900 또는 이전 GDB 명령은 I가 들어 넣은 649 00:53:36,900 --> 00:53:56,000 나는 Enter를 누를 유지할 수 있으며 선으로 내 코드 라인을 통해 스테핑하겠습니다. 650 00:53:56,000 --> 00:53:59,310 나는 너희들이 다른 버그 프로그램을뿐만 아니라 체크 아웃 할 것을 권장합니다. 651 00:53:59,310 --> 00:54:01,330 우리는 모두 오늘 섹션에 통과 할 시간이 없습니다. 652 00:54:01,330 --> 00:54:05,890 소스 코드가, 그래서 당신은 무슨 일이 볼의 종류 수 653 00:54:05,890 --> 00:54:07,730 당신이 정말 곤란한 상황에 처하더라도 장면 뒤에, 654 00:54:07,730 --> 00:54:11,940 하지만 적어도, 그냥, GDB를 부팅 연습 655 00:54:11,940 --> 00:54:13,940 당신에 깨진 때까지 프로그램을 실행 656 00:54:13,940 --> 00:54:18,260 , 역 추적을 받고 추락에 있던 기능을하는지 알아 냈어 657 00:54:18,260 --> 00:54:24,450 어떤 라인이 어떤 변수 값을 인쇄에했다 658 00:54:24,450 --> 00:54:30,140 그런 일이 실제로 당신이 앞으로 도움이 될 것입니다 때문에 너무 당신은 그것을위한 느낌을 얻을. 659 00:54:30,140 --> 00:54:36,340 이 시점에서, 우리는 당신이 Q를 종료 사용하거나 않는, GDB에서 종료거야. 660 00:54:36,340 --> 00:54:40,460 프로그램이 아직 실행의 중간에,하고 종료되지 않은 경우는, 661 00:54:40,460 --> 00:54:43,510 항상 당신을 물어볼 것입니다, "당신은 당신이 정말로 종료 하시겠습니까?" 662 00:54:43,510 --> 00:54:48,770 당신은 예 누르 할 수 있습니다. 663 00:54:48,770 --> 00:54:55,250 >> 이제 우리는 고양이 프로그램입니다 우리가 가지고있는 다음 문제 보는거야. 664 00:54:55,250 --> 00:54:59,880 당신이 리디렉션 및 파이프에 대한 짧은를 볼 경우, 토미이 프로그램을 사용하는 것을 확인할 수 있습니다 665 00:54:59,880 --> 00:55:07,540 그 기본적으로 화면에 파일의 출력을 인쇄합니다. 666 00:55:07,540 --> 00:55:12,660 나는 고양이를 실행하면,이 어플라이언스에 실제로 내장 된 프로그램입니다, 667 00:55:12,660 --> 00:55:16,860 당신이 맥이 경우 터미널을 열고면 당신은 너무 당신의 Mac에서이 작업을 수행 할 수 있습니다. 668 00:55:16,860 --> 00:55:25,630 그리고 우리가 - 고양이가, cp.c의 말을 듣지하고 Enter 키를. 669 00:55:25,630 --> 00:55:29,640 이 무슨 짓을했는지, 우리가 좀 더 빨리 스크롤하고 우리가 선을 뛰어 위치를 확인하는 경우 670 00:55:29,640 --> 00:55:40,440 또는 우리가 고양이 명령을 실행 곳, 그건 말 그대로 우리의 화면으로 cp.c의 내용을 출력한다. 671 00:55:40,440 --> 00:55:44,140 우리는 다시 실행할 수 있으며 여러 개의 파일에 넣을 수 있습니다. 672 00:55:44,140 --> 00:55:49,880 , 그래서 당신은 고양이 cp.c을 할 수 있으며, 그런 다음 우리는 또한 cat.c 파일을 연결하여 수 673 00:55:49,880 --> 00:55:53,250 그 때문에 우리가 기사를 쓰고 싶은있는 프로그램입니다 674 00:55:53,250 --> 00:55:58,140 그리고 우리의 화면으로 돌아 다시 두 파일을 인쇄 할 수 있습니다. 675 00:55:58,140 --> 00:56:05,490 우리가 조금 위로 스크롤하면 그래서, 우리는 우리가보고 우리는이 고양이 cp.c, cat.c를 실행할 때 676 00:56:05,490 --> 00:56:17,110 처음에는 CP 파일을 출력하고, 그 아래가 바로 여기 cat.c 파일을 출력한다. 677 00:56:17,110 --> 00:56:19,650 우리는 우리의 발은 젖이를 사용하는거야. 678 00:56:19,650 --> 00:56:25,930 터미널로 간단한 인쇄와 주변 재생, 그 작동 방식을 참조하십시오. 679 00:56:25,930 --> 00:56:39,170 너희들이 gedit cat.c을 열고 경우, Enter 키를 누르 680 00:56:39,170 --> 00:56:43,760 당신은 우리가 작성하는 정도 남았하는 프로그램을 볼 수 있습니다. 681 00:56:43,760 --> 00:56:48,980 우리가이 좋은 보일러 판을 포함, 우리 모두가 그 곳을 입력 시간을 할애 할 필요가 없습니다 않도록. 682 00:56:48,980 --> 00:56:52,310 우리는 한번 이용해 전달되는 인자의 수를 확인 683 00:56:52,310 --> 00:56:56,910 우리는 좋은 사용 메시지를 인쇄 할 수 있습니다. 684 00:56:56,910 --> 00:57:00,950 >> 이 다시 같은 우리가 얘기 한 것들입니다 685 00:57:00,950 --> 00:57:04,490 거의 근육 기억 같은 거예요. 686 00:57:04,490 --> 00:57:07,190 그냥 물건 같은 종류의 일을 계속 기억 687 00:57:07,190 --> 00:57:11,310 항상 도움이 어떤 메세지를 인쇄 688 00:57:11,310 --> 00:57:17,670 수 있도록 사람들이 귀하의 프로그램을 실행하는 방법을 알고. 689 00:57:17,670 --> 00:57:21,630 고양이와 함께, 꽤 간단합니다, 우리는 서로 다른 인수를 모두 통과 할거야 690 00:57:21,630 --> 00:57:24,300 그는 우리의 프로그램에 전달했고, 우리는 인쇄 할거야 691 00:57:24,300 --> 00:57:29,950 한 번에 화면 하나에 해당 내용 아웃. 692 00:57:29,950 --> 00:57:35,670 화면에 파일을 인쇄하기 위해, 우리는 매우 유사한 무언가를 할 수있는 것 693 00:57:35,670 --> 00:57:38,120 우리는 퀴즈의 끝 부분에 무슨 짓을합니다. 694 00:57:38,120 --> 00:57:45,350 프로그램을 고용 퀴즈의 끝에서, 우리는 파일을 열어 줄 수밖에 없었어 695 00:57:45,350 --> 00:57:48,490 그리고 우리는 그것에 인쇄했다. 696 00:57:48,490 --> 00:57:54,660 이 경우, 우리는 파일을 열거야, 우리는 대신에서 읽을거야. 697 00:57:54,660 --> 00:58:00,630 그럼 우리 대신 파일을 인쇄 할거야, 우리는 화면에 인쇄 할거야. 698 00:58:00,630 --> 00:58:05,830 그래서 당신은 모든 printf를하기 전에 한 화면에 인쇄합니다. 699 00:58:05,830 --> 00:58:08,290 그래서 그런 미친 짓 없습니다. 700 00:58:08,290 --> 00:58:12,190 그러나 파일을 읽는 것은 좀 이상합니다. 701 00:58:12,190 --> 00:58:17,300 우리는 시간에 그 조금을 통해 갈거야. 702 00:58:17,300 --> 00:58:20,560 당신들 퀴즈, 문제 33,에 마지막 문제로 돌아 가면 703 00:58:20,560 --> 00:58:27,280 우리가 여기서 뭘하고있는 첫 번째 줄은 파일을 여는, 우리가 한 짓과 매우 유사합니다. 704 00:58:27,280 --> 00:58:36,370 스텔라 그럼, 우리가 파일을 열 때처럼 그 선 보이지 않아? 705 00:58:36,370 --> 00:58:47,510 [스텔라] 자본금 파일 * 파일 - >> 좋아요. >> - fopen 동일합니다. >> 그래. 706 00:58:47,510 --> 00:58:55,980 이 경우에는 뭐죠? 이 코멘트에 있어요. 707 00:58:55,980 --> 00:59:06,930 >>이 코멘트에? 변수는 argv [I]와 R? 708 00:59:06,930 --> 00:59:11,300 정확히 >>. 맞아. 그럼 스텔라 완전히 맞아. 709 00:59:11,300 --> 00:59:13,720 이 줄은 모습입니다. 710 00:59:13,720 --> 00:59:19,670 우리는 파일 스트림 변수를 FILE *에 보관하려고, 그래서하는 모든 모자, 711 00:59:19,670 --> 00:59:25,720 FILE *,이 변수의 이름은 파일이됩니다. 712 00:59:25,720 --> 00:59:32,250 우리는 우리가 좋아하는대로 부르 수 있습니다. 우리는 우리가 원하는대로, 그 first_file, 또는 file_i 전화 수 있습니다. 713 00:59:32,250 --> 00:59:37,590 그리고 파일의 이름은이 프로그램의 명령 줄에서 통과되었다. 714 00:59:37,590 --> 00:59:44,450 따라서이 변수는 argv에 저장 [I,] 그리고 우리가 읽을 모드에서이 파일을 열거야. 715 00:59:44,450 --> 00:59:48,100 우리가 파일을 열으니 이젠, 어떻게 우리가 늘 기억해야하는 일이야 716 00:59:48,100 --> 00:59:52,230 우리는 파일을 열었습니다 때마다? 를 닫습니다. 717 00:59:52,230 --> 00:59:57,220 미시 그래서 어떻게 파일을 닫습니다합니까? 718 00:59:57,220 --> 01:00:01,020 [미시] fclose (파일) >> fclose (파일). 그렇지. 719 01:00:01,020 --> 01:00:05,340 좋아요. 좋아요. 우리는 여기에 코멘트를 할이 만난다면 720 01:00:05,340 --> 01:00:11,940 는 "오픈 변수는 argv [I]와 STDOUT 그 내용을 인쇄 할 수 있습니다."라고 721 01:00:11,940 --> 01:00:15,460 >> 표준 출력은 이상한 이름입니다. STDOUT 말의 우리의 방법이다 722 01:00:15,460 --> 01:00:22,880 우리는 터미널에 인쇄 할, 우리는 표준 출력 스트림에 인쇄하고 싶습니다. 723 01:00:22,880 --> 01:00:26,450 우리는 실제로 여기이 댓글을 삭제 할 수 있습니다. 724 01:00:26,450 --> 01:00:36,480 난 복사하고 우리가 한 짓 이니까 붙여 넣기거야. 725 01:00:36,480 --> 01:00:41,290 이 시점에서, 이제 우리는 비트하여 파일 비트를 읽을 수 있습니다. 726 01:00:41,290 --> 01:00:46,300 우리는 독서 파일의 몇 가지 방법에 대해 논의했습니다. 727 01:00:46,300 --> 01:00:51,830 어떤 사람은 지금까지 즐겨 찾기입니까? 728 01:00:51,830 --> 01:00:57,960 어떤 방법으로 당신이 본 또는 파일을 읽을 수있는 거, 기억 나? 729 01:00:57,960 --> 01:01:04,870 [다니엘] fread? >> fread? 따라서 fread는 하나입니다. 지미, 당신은 어떤 다른 사람을 알 수 있습니까? 730 01:01:04,870 --> 01:01:12,150 [지미] 번호 >> 좋아요. 아뇨. 샬롯? 알렉산더? 다른 놈들은? 좋아요. 731 01:01:12,150 --> 01:01:20,740 그래서 다른 사람들은 많이를 사용하는 하나의 fgetc되어 있습니다. 732 01:01:20,740 --> 01:01:26,410 또한, fscanf도, 너희들은 여기에 패턴을 보여? 733 01:01:26,410 --> 01:01:29,170 그들은 모두 F로 시작합니다. 파일과는 아무. 734 01:01:29,170 --> 01:01:35,260 fread는 fgetc, fscanf있다. 이것들은 읽기 기능에 있습니다. 735 01:01:35,260 --> 01:01:49,120 우리가 fwrite를 쓰기 위해 대신 fgetc의 fputc 있습니다. 736 01:01:49,120 --> 01:01:58,250 우리는 또한 fprintf 우리가 퀴즈에서 본 좋아했다. 737 01:01:58,250 --> 01:02:01,680 이 파일에서 읽는 관련된 문제이며, 때문에 738 01:02:01,680 --> 01:02:04,940 우리는 이러한 세 가지 기능 중 하나를 사용하려고하고 있습니다. 739 01:02:04,940 --> 01:02:10,890 우리는 여기서 이러한 기능을 사용하지 않을거야. 740 01:02:10,890 --> 01:02:14,880 이러한 기능은 모든 표준 I / O 라이브러리에 발견된다. 741 01:02:14,880 --> 01:02:17,510 이 프로그램의 상단에있는 이봐, 그렇게하는 경우 742 01:02:17,510 --> 01:02:24,110 당신은 우리가 이미 표준 I / O 라이브러리에 대한 헤더 파일을 포함 것을 볼 수 있습니다. 743 01:02:24,110 --> 01:02:27,120 우리가 알고 싶다면 어떤 우리가 사용하려는 744 01:02:27,120 --> 01:02:29,690 우리는 항상 그 사람 페이지를 열 수 있습니다. 745 01:02:29,690 --> 01:02:34,350 그래서 우리는 사람을 stdio를 입력 할 수 있습니다 746 01:02:34,350 --> 01:02:43,180 와 C.에서 stdio 입력 및 출력 기능에 대해 모두 읽었 747 01:02:43,180 --> 01:02:49,870 그리고 우리는 이미 오, 봐 볼 수 있습니다. 그것은 fgetc를 언급, 그렇지 fputc를 언급 있어요. 748 01:02:49,870 --> 01:02:57,220 그래서 fgetc는 조금 자세히 보면, 말할 수 749 01:02:57,220 --> 01:03:00,060 와 맨 페이지를 봐. 750 01:03:00,060 --> 01:03:03,430 당신은 다른 기능의 전체 무리와 함께가는 것을 알 수 있습니다 : 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, 도착, ungetc, 그리고 문자와 문자열의 입력. 752 01:03:12,640 --> 01:03:19,180 그래서 우리가 표준 입력으로부터 파일에서 문자와 문자열에서 읽을 방법입니다 753 01:03:19,180 --> 01:03:21,990 이는 사용자의 근본적이다. 754 01:03:21,990 --> 01:03:24,780 그리고 우리는 실제 C.에서 어떻게입니다 755 01:03:24,780 --> 01:03:30,850 그래서이 GetString 및 GetChar 함수를 사용하지 않습니다 756 01:03:30,850 --> 01:03:36,840 우리는 CS50 라이브러리에서 사용했던. 757 01:03:36,840 --> 01:03:39,710 우리는 몇 가지 방법으로이 문제를 할 수있는 것 758 01:03:39,710 --> 01:03:43,430 수 있도록 당신은 그 일을 두 가지 방법을 볼 수 있습니다. 759 01:03:43,430 --> 01:03:48,490 fread 다니엘이 말한 기능과 fgetc 모두 그렇게하는 것은 좋은 방법입니다. 760 01:03:48,490 --> 01:03:53,790 그것은 단지 있기 때문에 당신이보다시피 나는,,, fgetc을 좀 더 쉽게 생각 761 01:03:53,790 --> 01:03:59,660 하나의 인수, 우리는 문자를에서 읽기 위해 노력하고있는 파일 * 762 01:03:59,660 --> 01:04:02,740 와 반환 값은 정수입니다. 763 01:04:02,740 --> 01:04:05,610 그리고 바로 좀 혼란? 764 01:04:05,610 --> 01:04:11,450 >> 우리는 문자를 받고 있기 때문에, 왜이 반환에게 문자, 그렇지? 765 01:04:11,450 --> 01:04:18,700 당신들은이 문자를 반환하지 이유에 어떤 아이디어가? 766 01:04:18,700 --> 01:04:25,510 [미시 답변, 이해할 수없는] >> 그래. 따라서 미시 완전히 맞아. 767 01:04:25,510 --> 01:04:31,570 이 ASCII이라면,이 정수는 실제 문자에 매핑 될 수 있습니다. 768 01:04:31,570 --> 01:04:33,520 ASCII 문자이어야하며 맞아 없습니다. 769 01:04:33,520 --> 01:04:36,220 그게 정확히 무슨 일이 일어나고 있는지입니다. 770 01:04:36,220 --> 01:04:39,190 더 비트가 단순히 때문에 정수를 사용하고 있습니다. 771 01:04:39,190 --> 01:04:44,750 우리의 문자는 8 비트가, 우리의 32 비트 컴퓨터에서 1 바이트 그, 그것은 문자보다 크 잖아. 772 01:04:44,750 --> 01:04:48,520 그리고 int는 공간의 모든 4 바이트 '가치가 있습니다. 773 01:04:48,520 --> 01:04:50,940 그리고 방법은 fgetc가 작동 밝혀, 774 01:04:50,940 --> 01:04:53,940 우리는이 사람이 페이지를 조금 우리의 개요에 아래로 스크롤하면 775 01:04:53,940 --> 01:05:05,000 모든 방법을 아래로 스크롤합니다. 그 사람들이 EOF라는이 특별한 값을 사용하는 것이 밝혀졌다. 776 01:05:05,000 --> 01:05:09,640 이 fgetc 함수의 리턴 값으로 특별한 상수입니다 777 01:05:09,640 --> 01:05:14,570 당신은 파일의 끝을 누르거나 오류가 발생하는 경우. 때마다 778 01:05:14,570 --> 01:05:18,170 그리고, 제대로 EOF과 함께 비교를 할 것이 밝혀 779 01:05:18,170 --> 01:05:24,060 당신은 정수에 갖고있는 정보의 추가 금액을 갖고 싶어 780 01:05:24,060 --> 01:05:28,420 같은 문자 변수를 사용하여 반대했다. 781 01:05:28,420 --> 01:05:32,130 fgetc 효과적으로, 파일에서 문자를 받고있다하더라도 782 01:05:32,130 --> 01:05:38,450 당신은 당신에게 유형 INT의 뭔가를 반환하는지 기억하고 싶습니다. 783 01:05:38,450 --> 01:05:41,360 그게 사용하기 매우 쉽게했다. 784 01:05:41,360 --> 01:05:44,960 우리에게 문자를 포기할 것, 그래서 우리가해야 할 모든 파일을 물어 보는 있으며, 785 01:05:44,960 --> 01:05:48,440 "나에게 다음 문자를주고, 나에게 다음 문자를주고, 나에게 다음 문자를 줘" 786 01:05:48,440 --> 01:05:51,400 우리는 파일의 끝에까지. 787 01:05:51,400 --> 01:05:54,730 그리고, 우리의 파일에서 한 번에 한 문자를 가져옵니다 788 01:05:54,730 --> 01:05:56,250 그리고 우리는 그것으로 원하는대로 할 수 있습니다. 789 01:05:56,250 --> 01:06:00,160 우리는을 저장할 수 있습니다, 우리는 문자열에 추가 할 수 있습니다 우리는 그것을 인쇄 할 수 있습니다. 790 01:06:00,160 --> 01:06:04,630 그 중 하나를 수행합니다. 791 01:06:04,630 --> 01:06:09,600 >> 아웃 다시 확대하고 cat.c 프로그램으로 돌아 간다, 792 01:06:09,600 --> 01:06:16,170 우리는 fgetc를 사용 간다면, 793 01:06:16,170 --> 01:06:21,710 어떻게이 코드 다음 줄에 접근 할 수? 794 01:06:21,710 --> 01:06:26,020 우리는 사용하는 것 - fread이 약간 다른 것을 할 것입니다. 795 01:06:26,020 --> 01:06:32,600 그리고 이번에는, 우리는 한 번에 하나의 문자를 얻을 fgetc를 사용하려고하고 있습니다. 796 01:06:32,600 --> 01:06:40,910 전체 파일을 처리하기 위해, 우리는해야할까요? 797 01:06:40,910 --> 01:06:44,030 저기 파일에 몇 자입니까? 798 01:06:44,030 --> 01:06:47,390 많이 있습니다. 그래서 당신은 아마도 하나 사야 799 01:06:47,390 --> 01:06:49,860 그리고 또 다른을 다른을 다른을. 800 01:06:49,860 --> 01:06:53,330 우리가 여기 사용해야 할 수도 있습니다 알고리즘의 어떤 것 같아요? 801 01:06:53,330 --> 01:06:55,470 어떤 유형의 -? 루프 [알렉산더]? 정확히 >>. 802 01:06:55,470 --> 01:06:57,500 루프의 일부 유형입니다. 803 01:06:57,500 --> 01:07:03,380 루프는이 경우에, 실제로 큰 것입니다. 804 01:07:03,380 --> 01:07:08,620 당신은 전체 파일을 통해 루프를 원하는 것처럼 당신이 말하는 것 같은, 이건 소리 805 01:07:08,620 --> 01:07:11,820 한 번에 문자를 받고. 806 01:07:11,820 --> 01:07:13,850 같이 무엇인지에 대한 방법은? 807 01:07:13,850 --> 01:07:22,090 [알렉산더 이해할 수없는] 808 01:07:22,090 --> 01:07:30,050 >> 알았어요, 당신이 무엇을하려는 지 영어로 말해? [알렉산더 이해할 수없는] 809 01:07:30,050 --> 01:07:36,270 우리가 전체 파일 이상 반복하는 것처럼 그래서이 경우에는, 듣기. 810 01:07:36,270 --> 01:07:45,330 [알렉산더] 그래서 <정수의 크기? >>의 크기 -? 811 01:07:45,330 --> 01:07:49,290 난, 파일의 크기를 알아? 크기 - 꼭 그냥 이렇게 써주세요. 812 01:07:49,290 --> 01:07:57,470 시간에 파일의 크기가되는, 내가 + +. 813 01:07:57,470 --> 01:08:04,610 그래서, 당신이 fgetc를 사용하고 않는 방법이 새로운 것이 밝혀 814 01:08:04,610 --> 01:08:10,460 단지 파일의 크기를 얻을 수 더 쉬운 방법이 없다는 것입니다 815 01:08:10,460 --> 01:08:16,979 당신은 전에 본 적이있는 구성의 "sizeof"유형. 816 01:08:16,979 --> 01:08:20,910 우리가 fgetc 함수를 사용하면, 우리는 어떤 종류의를 소개하고 817 01:08:20,910 --> 01:08:29,069 루프이에 새로운, 펑키 구문, 어디 대신 기본 카운터를 사용 818 01:08:29,069 --> 01:08:33,920 문자로 문자를 이동, 우리는 한 번에 하나의 문자를 끌어가는거야 819 01:08:33,920 --> 01:08:37,120 한번에 문자, 그리고 우리가 알고있는 방법은 우리 말에있어 820 01:08:37,120 --> 01:08:41,290 우리가 문자의 특정 숫자를 계산 한하지 않는 경우는, 821 01:08:41,290 --> 01:08:49,939 하지만 우리가 뽑아 문자 파일 캐릭터의 특별한 끝 때. 822 01:08:49,939 --> 01:08:58,689 이 채널에 연락, 우리는 그것을 초기화 할거야 - 그래서 우리는하여이 작업을 수행 할 수 있습니다 823 01:08:58,689 --> 01:09:08,050 파일의 아웃 첫 번째 문자를 얻을 수 첫 호출. 824 01:09:08,050 --> 01:09:14,979 바로이 부​​분 그래서이 파일의 캐릭터를 데리고 것입니다 825 01:09:14,979 --> 01:09:20,840 그리고 변수 채널에 저장합니다. 826 01:09:20,840 --> 01:09:25,420 우리가 파일의 끝에 얻을 때까지 우리는이 일을 계속 할거야 827 01:09:25,420 --> 01:09:41,170 하는 우리는 특별한 EOF 문자와 동일 게 아니라 문자에 대한 테스트에 의해서. 828 01:09:41,170 --> 01:09:48,750 대신 채널을 다하고을 그리고 + +, 그, 그냥 값을 증가 것 829 01:09:48,750 --> 01:09:52,710 우리는 파일의 아웃, A는 말 자본을 읽고, 그렇게하는 경우 830 01:09:52,710 --> 01:09:56,810 채널 + + 우리에게 B를 제공하게하고 우리가 C하고 D 겠어요. 831 01:09:56,810 --> 01:09:59,310 우리가 원하는 분명 아닙니다. 우리가 여기 원하는 832 01:09:59,310 --> 01:10:05,830 이 마지막 비트에서 우리는 파일에서 다음 문자를 얻고 자 할 수 있습니다. 833 01:10:05,830 --> 01:10:09,500 >> 그럼 우리는 파일에서 다음 문자를할까요? 834 01:10:09,500 --> 01:10:13,470 우리가 어떻게 파일에서 첫 번째 문자를 어떻게해야합니까? 835 01:10:13,470 --> 01:10:17,200 [학생] fgetfile? >> fgetc, 또는, 미안, 당신은 완전히 옳았다. 836 01:10:17,200 --> 01:10:20,470 바로 거기에 맞춤법이 틀린. 그래 그럼. 837 01:10:20,470 --> 01:10:26,240 여기에 대신 채널을하는 + +, 838 01:10:26,240 --> 01:10:29,560 우리는 다시 fgetc를 (파일)를 호출 할거야 839 01:10:29,560 --> 01:10:39,180 와 같은 채널 변수에 결과를 저장합니다. 840 01:10:39,180 --> 01:10:43,730 [학생 질문 이해할 수없는] 841 01:10:43,730 --> 01:10:52,390 이러한 파일 *의 사람들이 특별한 위치 >>입니다. 842 01:10:52,390 --> 01:10:59,070 그들이 작동하는 방법은 있습니다 - 당신이 처음 열 때 - 당신이 먼저 fopen 호출을 할 때, 843 01:10:59,070 --> 01:11:04,260 FILE *는 효과적으로 파일의 시작 부분에 포인터 역할을합니다. 844 01:11:04,260 --> 01:11:12,830 다음 fgetc 전화 때마다,이 파일을 통해 한 문자 이동합니다. 845 01:11:12,830 --> 01:11:23,280 이 전화를 자 할 때마다, 당신은 문자로 파일 포인터를 증가하고 있습니다. 846 01:11:23,280 --> 01:11:26,210 그리고 다시 fgetc 때, 당신이 다른 문자를 이동 847 01:11:26,210 --> 01:11:28,910 다른 문자와 다른 문자와 다른 문자가 있습니다. 848 01:11:28,910 --> 01:11:32,030 [학생 질문 이해할 수없는] >> 그리고 도대체 - 예. 849 01:11:32,030 --> 01:11:34,810 그것은 후드 아래에 마법입니다. 850 01:11:34,810 --> 01:11:37,930 당신은을 통해 증가 유지. 851 01:11:37,930 --> 01:11:46,510 이 시점에서, 당신은 실제로 문자로 일을 할 수있게되었습니다. 852 01:11:46,510 --> 01:11:52,150 그럼 이제, 화면에이 일을 인쇄 할 수? 853 01:11:52,150 --> 01:11:58,340 우리는 우리가 전에 사용했던 printf 일을 사용할 수 있습니다. 854 01:11:58,340 --> 01:12:00,330 우리는 모든 학기를 사용 했어. 855 01:12:00,330 --> 01:12:05,450 우리는 printf 호출 할 수 있습니다 856 01:12:05,450 --> 01:12:21,300 우리는 그 같은 캐릭터 전달할 수 있습니다. 857 01:12:21,300 --> 01:12:27,430 할 수있는 또 다른 방법은 오히려 printf 사용하고이 형식 문자열을 필요 미만인 858 01:12:27,430 --> 01:12:29,490 우리는 또한 다른 기능 중 하나를 사용할 수 있습니다. 859 01:12:29,490 --> 01:12:40,090 우리는 화면에 문자를 출력 fputc를 사용할 수 있습니다 860 01:12:40,090 --> 01:12:52,580 우리는 fputc 보면 제외하고는 - 내가 조금 축소 보자. 861 01:12:52,580 --> 01:12:56,430 우리는 어떤 좋은 건 우리가 fgetc를 사용하여 읽기하는 캐릭터 소요됩니다 참조 862 01:12:56,430 --> 01:13:05,100 하지만 우리는 그것을에 인쇄 할 수있는 스트림을 제공해야합니다. 863 01:13:05,100 --> 01:13:11,850 우리는 또한 표준 출력에 직접하게됩니다 putchar 함수를 사용할 수 있습니다. 864 01:13:11,850 --> 01:13:16,070 그래서 우리는 인쇄에 사용할 수있는 다양한 옵션의 전체 무리가 있습니다. 865 01:13:16,070 --> 01:13:19,580 그들은 표준 I / O 라이브러리의 잖아요. 866 01:13:19,580 --> 01:13:25,150 인쇄 할 때마다 - 그래서 printf 기본적으로, 스트림 아웃 특별한 표준을 출력합니다 867 01:13:25,150 --> 01:13:27,910 그 STDOUT이되는 것입니다. 868 01:13:27,910 --> 01:13:41,300 그래서 그냥이 마법 가치, 여기에 STDOUT 종류로 참조 할 수 있습니다. 869 01:13:41,300 --> 01:13:48,410 죄송합니다. 외부 세미콜론을 놔. 870 01:13:48,410 --> 01:13:52,790 >> 여긴 새로운 펑키 많은 정보입니다. 871 01:13:52,790 --> 01:13:58,600 이 많은이 코드이라는 관점에 입각하면 매우 관용어 법입니다 872 01:13:58,600 --> 01:14:05,700 이 읽기 쉽게 읽을 수 깨끗해서 이런 식으로 작성하게된다. 873 01:14:05,700 --> 01:14:11,520 그렇게하는 방법에는 여러 가지, 당신이 사용할 수있는 다른 기능이 있습니다 874 01:14:11,520 --> 01:14:14,680 하지만 우리는 계속해서이 같은 패턴을 따라하는 경향이 있습니다. 875 01:14:14,680 --> 01:14:20,180 다시 다시오고 같은 코드를 보면 놀라지하지 않습니다. 876 01:14:20,180 --> 01:14:25,690 괜찮아요. 이 시점에서, 우리는 하루에 깨해야합니다. 877 01:14:25,690 --> 01:14:31,300 와 주셔서 감사합니다. 사용자가 온라인이라면 시청 해 주​​셔서 감사합니다. 그리고 우리는 다음 주에 볼 수 있습니다. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]