1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [파일 I / O] 2 00:00:02,000 --> 00:00:04,000 [제이슨 Hirschhorn, 하버드 대학교] 3 00:00:04,000 --> 00:00:07,000 [이, CS50.TV CS50입니다] 4 00:00:07,000 --> 00:00:11,000 우리가 파일을 생각하면, 어떻게, MS 워드 문서입니다 떠오르는 5 00:00:11,000 --> 00:00:14,000 JPEG 이미지, 또는 MP3 노래, 6 00:00:14,000 --> 00:00:17,000 우리는 다양한 방법으로 이러한 유형의 파일의 각 상호 작용할 수 있습니다. 7 00:00:17,000 --> 00:00:20,000 예를 들어, Word 문서에서 우리는 텍스트를 추가 8 00:00:20,000 --> 00:00:24,000 JPEG 이미지로 우리는 가장자리를 자르거나 색상을 보정 할 수있는 동안. 9 00:00:24,000 --> 00:00:28,000 그러나 후드 아래에 우리의 컴퓨터에있는 모든 파일은 더 이상 없습니다 10 00:00:28,000 --> 00:00:31,000 제로와 사람들의 긴 시퀀스보다. 11 00:00:31,000 --> 00:00:33,000 이 파일과 상호 작용하는 특정 응용 프로그램에 일이에요 12 00:00:33,000 --> 00:00:38,000 이 긴 시퀀스를 처리하고 사용자에게 제시하는 방법을 결정합니다. 13 00:00:38,000 --> 00:00:41,000 한편, 문서, 그냥 1 바이트 볼 수 있습니다 14 00:00:41,000 --> 00:00:45,000 또는 8 제로와 사람, 그리고는 화면에 ASCII 문자를 표시합니다. 15 00:00:45,000 --> 00:00:48,000 한편, 비트 맵 이미지, 3 바이트로 보일 수 있습니다 16 00:00:48,000 --> 00:00:50,000 또는 24 제로과 사랑하는 사람들, 17 00:00:50,000 --> 00:00:53,000 3 16 진수로 해석 18 00:00:53,000 --> 00:00:56,000 그 빨간색, 녹색, 파란색의 값을 나타냅니다 19 00:00:56,000 --> 00:00:58,000 이미지의 한 픽셀 인치 20 00:00:58,000 --> 00:01:01,000 어쨌든 그들은 자신의 핵심이 화면에처럼 보일 수 있습니다 21 00:01:01,000 --> 00:01:05,000 파일 제로와 사람의 순서보다 더 아무것도 없습니다. 22 00:01:05,000 --> 00:01:08,000 그럼하자에 잠수 우리가 실제로 이러한 제로와 사람을 조작하는 방법 살펴 23 00:01:08,000 --> 00:01:12,000 무슨 일이 작성하고 파일에서 읽기에 있어서는. 24 00:01:12,000 --> 00:01:15,000 >> 난 간단한 3 부분으로 프로세스에 연결을 파괴함으로써 시작합니다. 25 00:01:15,000 --> 00:01:19,000 다음으로,이 세 부분으로 입증이 코드 예제에 뛰어됩니다. 26 00:01:19,000 --> 00:01:23,000 마지막으로, 나는 과정을 검토하고 가장 중요한 세부 사항의 일부 수 있습니다. 27 00:01:23,000 --> 00:01:25,000 로 바탕 화면에 앉아있는 파일로, 28 00:01:25,000 --> 00:01:28,000 해야 할 첫 번째 물건을 열 것입니다. 29 00:01:28,000 --> 00:01:31,000 C에서 우리는 미리 정의 된 구조체에 대한 포인터를 선언하여이 작업을 수행 30 00:01:31,000 --> 00:01:33,000 그 디스크에있는 파일을 나타냅니다. 31 00:01:33,000 --> 00:01:38,460 이 함수 호출에서, 우리는 또한 우리가 작성하거나 파일에서 읽을 수할지 여부를 선택합니다. 32 00:01:38,460 --> 00:01:41,660 다음, 우리는 실제 읽기와 쓰기 작업을 수행. 33 00:01:41,660 --> 00:01:44,800 우리가이 부분에서 사용할 수있는 특수 기능의 숫자가 있습니다 34 00:01:44,800 --> 00:01:48,790 그리고 거의 모든 사람들의 파일을 의미합니다 문자 F,로 시작합니다. 35 00:01:48,790 --> 00:01:53,560 마지막으로 파일의 상단에있는 작은 빨간색 X 유사한는 사용자의 컴퓨터에 열 36 00:01:53,560 --> 00:01:56,680 우리는 최종 함수 호출로 파일을 닫습니다. 37 00:01:56,680 --> 00:01:59,540 이제 우리가 할 수있는 일은 무엇 일반적인 아이디어를 가지고, 38 00:01:59,540 --> 00:02:02,000 코드에 다이빙 보자. 39 00:02:02,000 --> 00:02:06,100 >> 이 디렉토리에, 우리는 두 C 파일 및 해당 실행 파일을 갖고 있습니다. 40 00:02:06,100 --> 00:02:09,710 타자기 프로그램은 한 명령 줄 인수를 소요 41 00:02:09,710 --> 00:02:12,060 우리가 생성 할 문서의 이름입니다. 42 00:02:12,060 --> 00:02:16,160 이 경우, 우리는 doc.txt 전화 할게. 43 00:02:16,160 --> 00:02:19,080 의이 프로그램을 실행하고 라인의 몇를 입력 보자. 44 00:02:19,080 --> 00:02:23,660 안녕하세요. 제 이름은 제이슨입니다. 45 00:02:23,660 --> 00:02:26,710 마지막으로, 우리는 "종료합니다."를 입력합니다 46 00:02:26,710 --> 00:02:29,720 우리는 이제이 디렉토리에있는 모든 파일을 나열하면 47 00:02:29,720 --> 00:02:33,770 우리는 새로운 문서가 doc.txt라는 존재를 참조하십시오. 48 00:02:34,190 --> 00:02:36,110 파일이 방금 만든이 프로그램들입니다. 49 00:02:36,110 --> 00:02:40,520 물론, 너무 제로와 사람들의 긴 시퀀스보다 더 아무것도 없습니다. 50 00:02:41,100 --> 00:02:43,260 우리는이 새로운 파일을 열 경우, 51 00:02:43,260 --> 00:02:45,870 우리는 우리의 프로그램에 입력 코드의 3 라인을 참조하십시오 - 52 00:02:46,060 --> 00:02:49,060 안녕하세요. 월 이름은 제이슨입니다. 53 00:02:49,580 --> 00:02:52,090 그런데 실제로 typewriter.c이 실행될 때 무슨 일이야? 54 00:02:52,810 --> 00:02:55,520 우리 관심의 첫 번째 줄은 줄 24입니다. 55 00:02:55,560 --> 00:02:58,490 이 행에서, 우리는 파일 포인터를 선언합니다. 56 00:02:59,080 --> 00:03:03,140 이 포인터 fopen을 반환 함수는 두 개의 인수를 걸립니다. 57 00:03:03,140 --> 00:03:07,440 첫 번째는 파일 확장자 해당되는 경우를 포함하여 파일의 이름입니다. 58 00:03:07,440 --> 00:03:10,980 파일 확장자는 가장 낮은 수준의 파일에 영향을주지 않는 기억합니다. 59 00:03:10,980 --> 00:03:14,640 우리는 항상 제로와 사람들의 긴 시퀀스를 다루고 있습니다. 60 00:03:14,640 --> 00:03:19,630 그러나 파일이 해석과 응용 프로그램을 여는 데 사용되는 방법을 영향을하지 않습니다. 61 00:03:19,630 --> 00:03:22,290 fopen에 대한 두 번째 인수는 단일 문자입니다 62 00:03:22,290 --> 00:03:25,300 우리가 우리가 파일을 열 후에 뭘 할 건지를 의미합니다. 63 00:03:25,300 --> 00:03:30,630 W, R, 및 A. -이 인수에 대한 세 가지 옵션이 있습니다 64 00:03:30,630 --> 00:03:34,900 우리가 파일에 기록 할 때문에이 경우에 w를 선택했습니다. 65 00:03:34,900 --> 00:03:38,820 R, 당신은 아마 추측 수 있듯이, 파일을 읽기위한 것입니다. 66 00:03:38,820 --> 00:03:41,760 그리고이 파일에 첨부입니다. 67 00:03:41,760 --> 00:03:44,960 동안 w와이 파일에 쓰기 위해 사용될 수있다 모두 68 00:03:44,960 --> 00:03:47,460 w는 파일의 처음부터 쓰기 시작합니다 69 00:03:47,460 --> 00:03:50,810 잠재적으로 이전에 저장 한 모든 데이터를 덮어 씁니다. 70 00:03:50,810 --> 00:03:54,070 기본적으로는 이미 존재하지 않는 경우 우리가 열 파일 71 00:03:54,070 --> 00:03:57,180 현재의 작업 디렉토리에 생성됩니다. 72 00:03:57,180 --> 00:04:00,540 그러나, 우리는 다른 위치에서 파일을 액세스하거나 만들려면 73 00:04:00,540 --> 00:04:02,650 fopen의 첫 번째 인수에 74 00:04:02,650 --> 00:04:05,840 우리는 파일 이름에 추가로 파일 경로를 지정할 수 있습니다. 75 00:04:05,840 --> 00:04:09,490 이 과정의 첫 번째 부분은 긴 코드의 한 라인이지만 76 00:04:09,490 --> 00:04:12,350 이 라인의 또 다른 집합을 포함하는 것이 좋은 연습입니다 77 00:04:12,350 --> 00:04:15,930 그 파일이 성공적으로 열거 나 생성 된 수 있도록 확인합니다. 78 00:04:15,930 --> 00:04:20,300 fopen은 null을 반환하면, 우리는 우리의 프로그램을 진행 위조 싶지 않아 79 00:04:20,300 --> 00:04:23,270 운영 체제가 메모리가 부족하면이 발생할 수 있습니다 80 00:04:23,270 --> 00:04:27,940 또는 우리가 적절한 권한을 가지고 있지 않은 것들에 대한 디렉토리에있는 파일을 열려고하면. 81 00:04:27,940 --> 00:04:31,780 >> 프로세스의 두 번째 부분은 타자기의 동안 루프에서 열립니다. 82 00:04:31,780 --> 00:04:35,000 우리는 사용자의 입력을 얻을 CS50 라이브러리 함수를 사용하여 83 00:04:35,000 --> 00:04:37,190 그리고, 그들은 프로그램을 종료하지 않으 가정 84 00:04:37,190 --> 00:04:41,940 우리는 문자열을 가져 가서 파일에 쓰는 함수 fputs를 사용합니다. 85 00:04:41,940 --> 00:04:46,700 fputs 우리가 파일에 기록하는 데 사용할 수있는 많은 기능 중 하나입니다. 86 00:04:46,700 --> 00:04:51,920 기타 fwrite, fputc, 심지어 fprintf가 포함되어 있습니다. 87 00:04:51,920 --> 00:04:54,840 에 관계없이 특정 기능의 우리는하지만, 사용을 종료 88 00:04:54,840 --> 00:04:57,480 그들 모두는 자신의 인수를 통해 알 필요가 89 00:04:57,480 --> 00:04:59,670 적어도 두 가지 - 90 00:04:59,670 --> 00:05:03,140 어떤은 기록 할 필요가있는 곳 작성해야합니다. 91 00:05:03,140 --> 00:05:07,240 우리의 경우, 입력은 작성해야하는 문자열입니다 92 00:05:07,240 --> 00:05:11,290 및 FP는 우리가 작성하는 곳으로 우리를 이끌고 포인터입니다. 93 00:05:11,290 --> 00:05:15,330 이 프로그램에서 프로세스의 두 번째 부분은 오히려 간단합니다. 94 00:05:15,330 --> 00:05:17,360 우리는 단순히 사용자의 문자열을 복용 95 00:05:17,360 --> 00:05:22,120 와 함께 우리의 파일에 직접 추가 작은 - 투 - 노 입력 유효성 검사 또는 보안 확인합니다. 96 00:05:22,120 --> 00:05:26,160 종종, 그러나, 2는 코드의 대부분을 차지합니다. 97 00:05:26,160 --> 00:05:30,580 우리가 파일을 닫을 곳 마지막으로, 일부 세 줄 58에 있습니다. 98 00:05:30,580 --> 00:05:34,860 여기 우리는 우리의 원래 파일 포인터를 fclose하고 전달 전화하십시오. 99 00:05:34,860 --> 00:05:39,500 다음 행에서, 우리는 프로그램의 끝을 신호, 제로 반환합니다. 100 00:05:39,500 --> 00:05:42,630 그리고, 네, 일부 세 그만큼 간단합니다. 101 00:05:42,630 --> 00:05:45,260 >> 의 파일에서 읽기로 이동하세요. 102 00:05:45,260 --> 00:05:48,220 다시 우리 디렉토리에서 우리는 printer.c라는 파일이 있습니다. 103 00:05:48,220 --> 00:05:50,910 의 우리가 방금 만든 파일을 실행 해 보자 - 104 00:05:50,910 --> 00:05:53,350 doc.txt. 105 00:05:53,350 --> 00:05:58,150 이 프로그램은, 이름에서 알 수 있듯이, 단순히 파일의 내용이 전달 인쇄됩니다. 106 00:05:58,150 --> 00:06:00,230 그리고 우리가 있습니다. 107 00:06:00,230 --> 00:06:03,780 코드의 라인은 우리가 이전에 입력하고 doc.txt에 저장했습니다. 108 00:06:03,780 --> 00:06:06,980 안녕하세요. 제 이름은 제이슨입니다. 109 00:06:06,980 --> 00:06:09,120 만약 printer.c에 우리는 다이빙, 110 00:06:09,120 --> 00:06:13,570 우리는 코드의 많은 우리가 typewriter.c에지나 갔다 것과 유사 것을 볼 수 있습니다. 111 00:06:13,570 --> 00:06:16,720 우리가 파일을 열 실제로 라인 22, 112 00:06:16,720 --> 00:06:19,220 우리가 파일을 폐쇄하고 라인 39,, 113 00:06:19,220 --> 00:06:23,890 두 typewriter.c과 거의 동일하다, fopen 두 번째 인수에 저장할 수 있습니다. 114 00:06:23,890 --> 00:06:26,510 우리가 파일에서 읽고이 시간, 115 00:06:26,510 --> 00:06:29,040 그래서 우리는 w 대신 R을 선택했습니다. 116 00:06:29,040 --> 00:06:31,950 따라서,의는 프로세스의 두 번째 부분에 초점을 맞춰 보자. 117 00:06:31,950 --> 00:06:36,060 라인 35에서, 우리의 네 루프의 두 번째 조건으로, 118 00:06:36,060 --> 00:06:38,590 우리는 fgets에 전화를 걸 119 00:06:38,590 --> 00:06:42,190 이전의 fputs에 동반자 기능. 120 00:06:42,190 --> 00:06:44,660 우리는 세 가지 인수가이 시간. 121 00:06:44,660 --> 00:06:48,810 첫 번째는 문자열이 저장 될 문자의 배열의 포인터입니다. 122 00:06:48,810 --> 00:06:52,670 두 번째 읽을 할 문자의 최대 수입니다. 123 00:06:52,670 --> 00:06:56,010 그리고 세 번째는 우리가 최선을 다하고되는 파일에 대한 포인터입니다. 124 00:06:56,010 --> 00:07:00,780 당신은 fgets가 null 반환 할 때 루프가 끝난 것을 알 수 있습니다. 125 00:07:00,780 --> 00:07:02,940 이있을 수 있습니다하는 두 가지 이유가 있습니다. 126 00:07:02,940 --> 00:07:05,380 첫째, 오류가 발생했을 수 있습니다. 127 00:07:05,380 --> 00:07:10,740 둘째, 더 많은 가능성이, 파일의 끝 부분에 도달했고 더 이상 문자는 읽을 수 있었다. 128 00:07:10,740 --> 00:07:14,040 당신이 궁금해하는 경우, 두 가지 기능은 우리가 알 수있게하는 존재 129 00:07:14,040 --> 00:07:17,160 하는 이유는이 특정 널 (null) 포인터에 대한 원인입니다. 130 00:07:17,160 --> 00:07:21,090 그리고 당연히, 그들은 파일로 작업을해야하기 때문에 131 00:07:21,090 --> 00:07:26,940 ferror 함수와 feof 함수 시작 문자 F로. 두 132 00:07:26,940 --> 00:07:32,130 >> 마지막으로, 우리가 결론 전에, 파일 함수의 끝 부분에 대해 한 빠른 메모, 133 00:07:32,130 --> 00:07:36,690 이는 단지 언급 한 바와 같이, feof로 작성됩니다. 134 00:07:36,690 --> 00:07:41,550 자주하면서 루프를위한 점진적으로 파일을 통해 방법을 읽을 때 사용하는 자신을 찾을 수 있습니다. 135 00:07:41,550 --> 00:07:45,790 이 파일의 마지막에 도달 한 후 따라서이 루프를 종료 할 수있는 방법이 필요합니다. 136 00:07:45,790 --> 00:07:50,510 파일 포인터에 feof를 호출하고 사실인지 알 확인 137 00:07:50,510 --> 00:07:52,310 그 할 것입니다. 138 00:07:52,310 --> 00:07:59,820 따라서 조건 (! feof (FP))와 잠시 동안 루프는 완벽하게 적절한 해결책처럼 보인다 수 있습니다. 139 00:07:59,820 --> 00:08:03,770 그러나, 우리는 텍스트 파일에 남아있는 한 줄을 말한다. 140 00:08:03,770 --> 00:08:07,130 우리는 동안 루프를 입력되고 계획대로 모든 일이 잘됩니다. 141 00:08:07,130 --> 00:08:12,750 을 통해 다음 라운드에서 우리의 프로그램은, FP의 feof에 해당하는 있는지 확인합니다 142 00:08:12,750 --> 00:08:15,430 하지만 -이 여기에 이​​해하는 중요한 포인트입니다 - 143 00:08:15,430 --> 00:08:17,770 그냥 아직 사실이 아닐 것입니다. 144 00:08:17,770 --> 00:08:21,110 feof의 목적은 확인되지 때문입니다 145 00:08:21,110 --> 00:08:24,400 읽기 함수에 다음 호출은 파일의 끝을 공격한다면은, 146 00:08:24,400 --> 00:08:28,190 오히려 파일의 끝에 이미 도달 여부를 확인합니다. 147 00:08:28,190 --> 00:08:30,140 이 예제의 경우, 148 00:08:30,140 --> 00:08:32,780 우리 파일의 마지막 줄을 읽는 것은 완벽하게 매우 간단합니다, 149 00:08:32,780 --> 00:08:36,210 하지만이 프로그램은 아직 우리가 파일의 끝을 마무리 한 알하지 않습니다. 150 00:08:36,210 --> 00:08:40,549 그 하나 추가 읽기를 수행 할 때까지 그렇지 않아이 카운터는 파일의 끝을 그. 151 00:08:40,549 --> 00:08:43,210 따라서, 정확한 조건은 다음과 같습니다 152 00:08:43,210 --> 00:08:49,330 fgets와 세 가지 인수 - 출력, 출력의 크기, 및 FP - 153 00:08:49,330 --> 00:08:52,570 그 같지 않음은 모두 null로합니다. 154 00:08:52,570 --> 00:08:55,260 이것은 우리가 printer.c에서 찍은 접근 방식 155 00:08:55,260 --> 00:08:57,890 이 경우, 루프 종료 후, 156 00:08:57,890 --> 00:09:04,290 당신은 feof 나 ferror이 루프를 종료에 대한 특정 이유에 관해서 사용자를 알려 전화 수 있습니다. 157 00:09:04,290 --> 00:09:08,100 >> 에 서면하고 파일을 읽는 것은 가장 기본적인에있다 158 00:09:08,100 --> 00:09:10,150 간단한 3 부분 과정입니다. 159 00:09:10,150 --> 00:09:12,530 첫째, 우리는 파일을 엽니 다. 160 00:09:12,530 --> 00:09:16,740 둘째, 우리는 우리의 파일에 몇 가지를 넣어 또는 그 밖에 몇 가지를. 161 00:09:16,740 --> 00:09:19,200 셋째, 우리는 파일을 닫습니다. 162 00:09:19,200 --> 00:09:21,170 첫 번째와 마지막 부분은 간단합니다. 163 00:09:21,170 --> 00:09:23,920 까다로운 물건이 자리하고있는 곳 가운데 부분입니다. 164 00:09:23,920 --> 00:09:27,760 그리고하지만 후드 아래에 우리는 항상 제로과 사랑하는 사람들의 긴 시퀀스를 다루고 있습니다 165 00:09:27,760 --> 00:09:30,710 추상화 레이어를 추가하는 코딩 할 때 도움이 되나요 166 00:09:30,710 --> 00:09:35,350 그게 더 밀접하게 우리가 보는 것에 익숙 비슷한 무언가로 순서를집니다. 167 00:09:35,350 --> 00:09:39,570 예를 들어, 우리는 24 비트 비트 맵 파일로 작업하는 경우, 168 00:09:39,570 --> 00:09:43,290 우리는 가능성이 읽거나 한 번에 세 바이트를 쓰기됩니다. 169 00:09:43,290 --> 00:09:46,450 이 경우, 그것은 정의하고 적절하게 이름을 이해 것이다 170 00:09:46,450 --> 00:09:48,980 3 바이트 큰 구조체. 171 00:09:48,980 --> 00:09:51,410 >> 파일로 작업하는 것은 복잡한 것처럼 보일 수 있지만, 172 00:09:51,410 --> 00:09:54,530 를 활용하는 것은 우리가 놀라운 일을 할 수 있습니다. 173 00:09:54,530 --> 00:09:58,880 우리는 우리의 프로그램 외부 세계의 상태를 변경할 수 있습니다 174 00:09:58,880 --> 00:10:01,730 우리는 우리의 프로그램의 수명 이상으로 사는 것을 만들 수 있습니다 175 00:10:01,730 --> 00:10:07,190 또는 우리는 우리의 프로그램이 실행 시작 이전에 생성 된 무언가를 변경할 수 있습니다. 176 00:10:07,190 --> 00:10:11,210 파일과 함께 상호 작용하는 것은 C. 프로그래밍의 진정한 강력한 부분입니다 177 00:10:11,210 --> 00:10:15,300 그리고 난 당신이 와서 할 수있는 코드에서 그것으로 만들 것 볼 기쁩니다. 178 00:10:15,300 --> 00:10:19,770 제 이름은 제이슨 Hirschhorn입니다. 이 CS50입니다. 179 00:10:19,770 --> 00:10:21,770 [CS50.TV] 180 00:10:21,770 --> 00:10:25,940 >> [웃음] 181 00:10:25,940 --> 00:10:29,330 좋아요. 하나는 걸릴. 여기 우리는 간다. 182 00:10:49,000 --> 00:10:52,140 우리가 파일을 생각하면 - >> 아, 잠깐. 미안 해요. 183 00:10:52,140 --> 00:10:56,800 [웃음] 그래. 184 00:11:06,620 --> 00:11:09,970 안녕. 185 00:11:13,670 --> 00:11:16,310 우리는 파일의 생각할 때 - 186 00:11:17,610 --> 00:11:20,710 당신은 파일을 생각하면 - 그래. 당신이 준비가되면 말해 봐요. 187 00:11:20,710 --> 00:11:22,520 오, 이런. 188 00:11:22,520 --> 00:11:26,180 텔레 프롬프터를 읽는 있지만 것처럼 보일 수 있습니다 - 아뇨. 내 실수 야.