[Powered by Google Translate] [파일 I / O] [제이슨 Hirschhorn, 하버드 대학교] [이, CS50.TV CS50입니다] 우리가 파일을 생각하면, 어떻게, MS 워드 문서입니다 떠오르는 JPEG 이미지, 또는 MP3 노래, 우리는 다양한 방법으로 이러한 유형의 파일의 각 상호 작용할 수 있습니다. 예를 들어, Word 문서에서 우리는 텍스트를 추가 JPEG 이미지로 우리는 가장자리를 자르거나 색상을 보정 할 수있는 동안. 그러나 후드 아래에 우리의 컴퓨터에있는 모든 파일은 더 이상 없습니다 제로와 사람들의 긴 시퀀스보다. 이 파일과 상호 작용하는 특정 응용 프로그램에 일이에요 이 긴 시퀀스를 처리하고 사용자에게 제시하는 방법을 결정합니다. 한편, 문서, 그냥 1 바이트 볼 수 있습니다 또는 8 제로와 사람, 그리고는 화면에 ASCII 문자를 표시합니다. 한편, 비트 맵 이미지, 3 바이트로 보일 수 있습니다 또는 24 제로과 사랑하는 사람들, 3 16 진수로 해석 그 빨간색, 녹색, 파란색의 값을 나타냅니다 이미지의 한 픽셀 인치 어쨌든 그들은 자신의 핵심이 화면에처럼 보일 수 있습니다 파일 제로와 사람의 순서보다 더 아무것도 없습니다. 그럼하자에 잠수 우리가 실제로 이러한 제로와 사람을 조작하는 방법 살펴 무슨 일이 작성하고 파일에서 읽기에 있어서는. 난 간단한 3 부분으로 프로세스에 연결을 파괴함으로써 시작합니다. 다음으로,이 세 부분으로 입증이 코드 예제에 뛰어됩니다. 마지막으로, 나는 과정을 검토하고 가장 중요한 세부 사항의 일부 수 있습니다. 로 바탕 화면에 앉아있는 파일로, 해야 할 첫 번째 물건을 열 것입니다. C에서 우리는 미리 정의 된 구조체에 대한 포인터를 선언하여이 작업을 수행 그 디스크에있는 파일을 나타냅니다. 이 함수 호출에서, 우리는 또한 우리가 작성하거나 파일에서 읽을 수할지 여부를 선택합니다. 다음, 우리는 실제 읽기와 쓰기 작업을 수행. 우리가이 부분에서 사용할 수있는 특수 기능의 숫자가 있습니다 그리고 거의 모든 사람들의 파일을 의미합니다 문자 F,로 시작합니다. 마지막으로 파일의 상단에있는 작은 빨간색 X 유사한는 사용자의 컴퓨터에 열 우리는 최종 함수 호출로 파일을 닫습니다. 이제 우리가 할 수있는 일은 무엇 일반적인 아이디어를 가지고, 코드에 다이빙 보자. 이 디렉토리에, 우리는 두 C 파일 및 해당 실행 파일을 갖고 있습니다. 타자기 프로그램은 한 명령 줄 인수를 소요 우리가 생성 할 문서의 이름입니다. 이 경우, 우리는 doc.txt 전화 할게. 의이 프로그램을 실행하고 라인의 몇를 입력 보자. 안녕하세요. 제 이름은 제이슨입니다. 마지막으로, 우리는 "종료합니다."를 입력합니다 우리는 이제이 디렉토리에있는 모든 파일을 나열하면 우리는 새로운 문서가 doc.txt라는 존재를 참조하십시오. 파일이 방금 만든이 프로그램들입니다. 물론, 너무 제로와 사람들의 긴 시퀀스보다 더 아무것도 없습니다. 우리는이 새로운 파일을 열 경우, 우리는 우리의 프로그램에 입력 코드의 3 라인을 참조하십시오 - 안녕하세요. 월 이름은 제이슨입니다. 그런데 실제로 typewriter.c이 실행될 때 무슨 일이야? 우리 관심의 첫 번째 줄은 줄 24입니다. 이 행에서, 우리는 파일 포인터를 선언합니다. 이 포인터 fopen을 반환 함수는 두 개의 인수를 걸립니다. 첫 번째는 파일 확장자 해당되는 경우를 포함하여 파일의 이름입니다. 파일 확장자는 가장 낮은 수준의 파일에 영향을주지 않는 기억합니다. 우리는 항상 제로와 사람들의 긴 시퀀스를 다루고 있습니다. 그러나 파일이 해석과 응용 프로그램을 여는 데 사용되는 방법을 영향을하지 않습니다. fopen에 대한 두 번째 인수는 단일 문자입니다 우리가 우리가 파일을 열 후에 뭘 할 건지를 의미합니다. W, R, 및 A. -이 인수에 대한 세 가지 옵션이 있습니다 우리가 파일에 기록 할 때문에이 경우에 w를 선택했습니다. R, 당신은 아마 추측 수 있듯이, 파일을 읽기위한 것입니다. 그리고이 파일에 첨부입니다. 동안 w와이 파일에 쓰기 위해 사용될 수있다 모두 w는 파일의 처음부터 쓰기 시작합니다 잠재적으로 이전에 저장 한 모든 데이터를 덮어 씁니다. 기본적으로는 이미 존재하지 않는 경우 우리가 열 파일 현재의 작업 디렉토리에 생성됩니다. 그러나, 우리는 다른 위치에서 파일을 액세스하거나 만들려면 fopen의 첫 번째 인수에 우리는 파일 이름에 추가로 파일 경로를 지정할 수 있습니다. 이 과정의 첫 번째 부분은 긴 코드의 한 라인이지만 이 라인의 또 다른 집합을 포함하는 것이 좋은 연습입니다 그 파일이 성공적으로 열거 나 생성 된 수 있도록 확인합니다. fopen은 null을 반환하면, 우리는 우리의 프로그램을 진행 위조 싶지 않아 운영 체제가 메모리가 부족하면이 발생할 수 있습니다 또는 우리가 적절한 권한을 가지고 있지 않은 것들에 대한 디렉토리에있는 파일을 열려고하면. 프로세스의 두 번째 부분은 타자기의 동안 루프에서 열립니다. 우리는 사용자의 입력을 얻을 CS50 라이브러리 함수를 사용하여 그리고, 그들은 프로그램을 종료하지 않으 가정 우리는 문자열을 가져 가서 파일에 쓰는 함수 fputs를 사용합니다. fputs 우리가 파일에 기록하는 데 사용할 수있는 많은 기능 중 하나입니다. 기타 fwrite, fputc, 심지어 fprintf가 포함되어 있습니다. 에 관계없이 특정 기능의 우리는하지만, 사용을 종료 그들 모두는 자신의 인수를 통해 알 필요가 적어도 두 가지 - 어떤은 기록 할 필요가있는 곳 작성해야합니다. 우리의 경우, 입력은 작성해야하는 문자열입니다 및 FP는 우리가 작성하는 곳으로 우리를 이끌고 포인터입니다. 이 프로그램에서 프로세스의 두 번째 부분은 오히려 간단합니다. 우리는 단순히 사용자의 문자열을 복용 와 함께 우리의 파일에 직접 추가 작은 - 투 - 노 입력 유효성 검사 또는 보안 확인합니다. 종종, 그러나, 2는 코드의 대부분을 차지합니다. 우리가 파일을 닫을 곳 마지막으로, 일부 세 줄 58에 있습니다. 여기 우리는 우리의 원래 파일 포인터를 fclose하고 전달 전화하십시오. 다음 행에서, 우리는 프로그램의 끝을 신호, 제로 반환합니다. 그리고, 네, 일부 세 그만큼 간단합니다. 의 파일에서 읽기로 이동하세요. 다시 우리 디렉토리에서 우리는 printer.c라는 파일이 있습니다. 의 우리가 방금 만든 파일을 실행 해 보자 - doc.txt. 이 프로그램은, 이름에서 알 수 있듯이, 단순히 파일의 내용이 전달 인쇄됩니다. 그리고 우리가 있습니다. 코드의 라인은 우리가 이전에 입력하고 doc.txt에 저장했습니다. 안녕하세요. 제 이름은 제이슨입니다. 만약 printer.c에 우리는 다이빙, 우리는 코드의 많은 우리가 typewriter.c에지나 갔다 것과 유사 것을 볼 수 있습니다. 우리가 파일을 열 실제로 라인 22, 우리가 파일을 폐쇄하고 라인 39,, 두 typewriter.c과 거의 동일하다, fopen 두 번째 인수에 저장할 수 있습니다. 우리가 파일에서 읽고이 시간, 그래서 우리는 w 대신 R을 선택했습니다. 따라서,의는 프로세스의 두 번째 부분에 초점을 맞춰 보자. 라인 35에서, 우리의 네 루프의 두 번째 조건으로, 우리는 fgets에 전화를 걸 이전의 fputs에 동반자 기능. 우리는 세 가지 인수가이 시간. 첫 번째는 문자열이 저장 될 문자의 배열의 포인터입니다. 두 번째 읽을 할 문자의 최대 수입니다. 그리고 세 번째는 우리가 최선을 다하고되는 파일에 대한 포인터입니다. 당신은 fgets가 null 반환 할 때 루프가 끝난 것을 알 수 있습니다. 이있을 수 있습니다하는 두 가지 이유가 있습니다. 첫째, 오류가 발생했을 수 있습니다. 둘째, 더 많은 가능성이, 파일의 끝 부분에 도달했고 더 이상 문자는 읽을 수 있었다. 당신이 궁금해하는 경우, 두 가지 기능은 우리가 알 수있게하는 존재 하는 이유는이 특정 널 (null) 포인터에 대한 원인입니다. 그리고 당연히, 그들은 파일로 작업을해야하기 때문에 ferror 함수와 feof 함수 시작 문자 F로. 두 마지막으로, 우리가 결론 전에, 파일 함수의 끝 부분에 대해 한 빠른 메모, 이는 단지 언급 한 바와 같이, feof로 작성됩니다. 자주하면서 루프를위한 점진적으로 파일을 통해 방법을 읽을 때 사용하는 자신을 찾을 수 있습니다. 이 파일의 마지막에 도달 한 후 따라서이 루프를 종료 할 수있는 방법이 필요합니다. 파일 포인터에 feof를 호출하고 사실인지 알 확인 그 할 것입니다. 따라서 조건 (! feof (FP))와 잠시 동안 루프는 완벽하게 적절한 해결책처럼 보인다 수 있습니다. 그러나, 우리는 텍스트 파일에 남아있는 한 줄을 말한다. 우리는 동안 루프를 입력되고 계획대로 모든 일이 잘됩니다. 을 통해 다음 라운드에서 우리의 프로그램은, FP의 feof에 해당하는 있는지 확인합니다 하지만 -이 여기에 이​​해하는 중요한 포인트입니다 - 그냥 아직 사실이 아닐 것입니다. feof의 목적은 확인되지 때문입니다 읽기 함수에 다음 호출은 파일의 끝을 공격한다면은, 오히려 파일의 끝에 이미 도달 여부를 확인합니다. 이 예제의 경우, 우리 파일의 마지막 줄을 읽는 것은 완벽하게 매우 간단합니다, 하지만이 프로그램은 아직 우리가 파일의 끝을 마무리 한 알하지 않습니다. 그 하나 추가 읽기를 수행 할 때까지 그렇지 않아이 카운터는 파일의 끝을 그. 따라서, 정확한 조건은 다음과 같습니다 fgets와 세 가지 인수 - 출력, 출력의 크기, 및 FP - 그 같지 않음은 모두 null로합니다. 이것은 우리가 printer.c에서 찍은 접근 방식 이 경우, 루프 종료 후, 당신은 feof 나 ferror이 루프를 종료에 대한 특정 이유에 관해서 사용자를 알려 전화 수 있습니다. 에 서면하고 파일을 읽는 것은 가장 기본적인에있다 간단한 3 부분 과정입니다. 첫째, 우리는 파일을 엽니 다. 둘째, 우리는 우리의 파일에 몇 가지를 넣어 또는 그 밖에 몇 가지를. 셋째, 우리는 파일을 닫습니다. 첫 번째와 마지막 부분은 간단합니다. 까다로운 물건이 자리하고있는 곳 가운데 부분입니다. 그리고하지만 후드 아래에 우리는 항상 제로과 사랑하는 사람들의 긴 시퀀스를 다루고 있습니다 추상화 레이어를 추가하는 코딩 할 때 도움이 되나요 그게 더 밀접하게 우리가 보는 것에 익숙 비슷한 무언가로 순서를집니다. 예를 들어, 우리는 24 비트 비트 맵 파일로 작업하는 경우, 우리는 가능성이 읽거나 한 번에 세 바이트를 쓰기됩니다. 이 경우, 그것은 정의하고 적절하게 이름을 이해 것이다 3 바이트 큰 구조체. 파일로 작업하는 것은 복잡한 것처럼 보일 수 있지만, 를 활용하는 것은 우리가 놀라운 일을 할 수 있습니다. 우리는 우리의 프로그램 외부 세계의 상태를 변경할 수 있습니다 우리는 우리의 프로그램의 수명 이상으로 사는 것을 만들 수 있습니다 또는 우리는 우리의 프로그램이 실행 시작 이전에 생성 된 무언가를 변경할 수 있습니다. 파일과 함께 상호 작용하는 것은 C. 프로그래밍의 진정한 강력한 부분입니다 그리고 난 당신이 와서 할 수있는 코드에서 그것으로 만들 것 볼 기쁩니다. 제 이름은 제이슨 Hirschhorn입니다. 이 CS50입니다. [CS50.TV] [웃음] 좋아요. 하나는 걸릴. 여기 우리는 간다. 우리가 파일을 생각하면 - >> 아, 잠깐. 미안 해요. [웃음] 그래. 안녕. 우리는 파일의 생각할 때 - 당신은 파일을 생각하면 - 그래. 당신이 준비가되면 말해 봐요. 오, 이런. 텔레 프롬프터를 읽는 있지만 것처럼 보일 수 있습니다 - 아뇨. 내 실수 야.