1 / 52

이 장에서는 데이터를 파일에 저장하고 , 저장된 파일의 데이터를 불러오는 파일 입력과 출력에 대해서 설명 [ 학습할 내용 ] 17.1 파일처리를 위한 기초 지식

17. 파일 출력과 파일 입력. 이 장에서는 데이터를 파일에 저장하고 , 저장된 파일의 데이터를 불러오는 파일 입력과 출력에 대해서 설명 [ 학습할 내용 ] 17.1 파일처리를 위한 기초 지식 17.2 텍스트 방식의 파일 다루기 [ 추가 문법 ] 17.3 이진 방식의 파일 다루기 17.4 원하는 블록의 위치에서 파일 읽기와 쓰기가 가능한 랜덤 처리 방식 [ 단원정리 ]. 파일 처리.

theo
Download Presentation

이 장에서는 데이터를 파일에 저장하고 , 저장된 파일의 데이터를 불러오는 파일 입력과 출력에 대해서 설명 [ 학습할 내용 ] 17.1 파일처리를 위한 기초 지식

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 17. 파일 출력과 파일 입력 이 장에서는 데이터를 파일에 저장하고, 저장된 파일의 데이터를 불러오는 파일 입력과 출력에 대해서 설명 [학습할 내용] 17.1 파일처리를 위한 기초 지식 17.2 텍스트 방식의 파일 다루기 [추가 문법] 17.3 이진 방식의 파일 다루기 17.4 원하는 블록의 위치에서 파일 읽기와 쓰기가 가능한 랜덤 처리 방식 [단원정리]

  2. 파일 처리 프로그램을 비롯하여 워드 프로세서로 작성된 문서 그리고 이미지들을 하드디스크에 저장하거나 불러오기 위해서는 파일(file)이라는 단위를 사용 컴퓨터에서 파일을 저장하는 단계는 문서들을 보관할 때 다음과 같은 단계를 거쳐 서랍장에 보관하는 것과 같은 방법이다.

  3. 파일 출력과 파일 입력 파일 출력 프로그램의 실행 결과로 만들어지는 데이터를 저장하고 싶다면 파일로 처리하여 저장해야 하며 이때 사용하는 방법 파일 입력 파일에 저장된 데이터 또는 결과를 프로그램 내에서 사용하기 위해 불러들이는 방법 C 언어에는 파일의 입력과 출력에 필요한 여러 라이브러리 함수 고수준의 파일 입출력(high level I/O) 함수와 저수준의 파일 입출력(low level I/O) 함수 고수준과 저수준의 차이는 버퍼의 사용 여부에 따라 구분하지만, 버퍼를 사용하는 고수준의 입출력 함수는 저수준의 입출력 함수보다 사용하기가 쉽다. 고수준의 입출력 함수의 사용은 ANSI 표준이므로 이에 대한 내용만을 설명

  4. 17.1 파일처리를 위한 기초 지식 파일을 입력하거나 출력하기 위한 첫 번째 단계 : 파일 열기(open), 마지막 단계 : 파일 닫기(close) 파일 입력이건 파일 출력이건 간에 먼저 파일을 열어(open)야 하며, 각각의 읽기와 쓰기 작업을 마친 후에는 반드시 파일을 닫아(close)주어야 한다. 이것은 노트에 새로운 내용을 쓰거나, 읽기 위해서는 먼저 노트를 열어(open)야 하며, 각각의 작업을 마친 후에 노트를 덮는(close) 것과 같은 방법

  5. [참고] 노트와 파일의 차이점 노트 : 노트를 열고(open) 읽거나(read) 쓰는(write) 작업을 노트의 어느 위치에서건 번갈아 가며 할 수 있다. 파일 : 파일을 열(open) 때 읽기 또는 쓰기를 할 것인지를 미리 정해 주어야 하기에 읽기와 쓰기를 번갈아 가며 할 수 없다. 그러나 하나의 프로그램 안에서 파일 읽기와 쓰기를 처리하고 싶다면 다음과 같은 방법을 이용할 수 있다.

  6. [참고] 파일 스트림(stream)이란? C 언어에서 사용하는 모든 입력과 출력은 파일을 읽고 쓰는 것과 같은 방법을 사용 그 이유는 C 언어가 키보드나 모니터(화면)를 포함하여 모든 주변 장치들을 파일처럼 취급하기 때문. 프로그램과 주변장치 사이의 접속(인터페이스, interface)을 하나의 통일된 방법으로 단순화시켜 사용하는데 있다. 따라서 모든 입력과 출력은 스트림(stream)이라고 하는 공통된 접속을 사용하여 파일로 취급되는 주변장치들과 연결된다. 프로그램에서 키보드와 화면에 대한 입력과 출력은 매우 빈번하게 일어나므로 파일을 open할 필요 없이 사용이 가능하지만 디스크 상의 파일에 대한 입력과 출력은 함수 fopen()을 사용하여 파일을 open해주어야만 사용할 수 있다.

  7. 17.1.2 파일 저장 방식 파일 저장방식 : 텍스트 방식(text mode)과 이진 방식(binary mode) 텍스트 방식으로 처리할 것인지 이진 방식으로 처리할 것인지는 파일 처리의 첫 번째 단계인 파일 열기(open)부분에서 구분한다.

  8. [참고] 이진 방식으로 저장된 파일의 내용이 메모장에서 이상하게 보이는 이유 컴퓨터의 메모리상에서 데이터가 byte의 연속으로 표현되어 기억되듯이 파일에 저장된 데이터들도 마찬가지 방법으로 저장된다. 텍스트 방식: 데이터를 파일에 저장하거나 파일로부터 읽을 때 ASCII 코드에 대응되는 byte 단위로 처리 이진 방식: 텍스트 방식과는 달리 데이터를 파일에 저장하거나 파일로부터 읽을 때 데이터 형(type)에 기준하여 처리. 그런데 이진 방식으로 저장된 내용을 텍스트 방식의 메모장 프로그램으로 읽으면 1 byte 단위로 읽은 데이터를 ASCII 코드의 문자로 해석하기 때문에 이상한 문자들로 출력된다.

  9. 17.1.3 파일 데이터와 파일 포인터 파일 입력 또는 파일 출력을 하기 위해 파일 열기(open)를 한 후에는 실제 데이터를 파일에 저장하거나 파일에 저장된 데이터를 읽기 위해서 포인터(pointer)를 사용한다. 파일처리에 사용하는 포인터를 파일 포인터라고 부르며 파일 포인터는 해당 파일과 관련된 정보가 들어있는 구조체를 가리킨다. 이 구조체는 헤더파일 <stdio.h>에 FILE 이라는 이름의 구조체 형으로 정의되어 있고, 파일 처리 프로그램을 작성할 때 이와 같은 파일 포인터가 사용된다.

  10. 17.2 텍스트 방식의 파일 다루기 파일 처리 원시 프로그램이 저장되어 있는 위치(폴더)에 "names.txt"라는 텍스트 파일을 읽는 작업을 처리하거나 "names.txt"라는 텍스트 파일로 출력할 때 다음과 같은 순서로 처리

  11. [단계 1] 파일 포인터 선언과 파일 열기 파일 열기는 함수 fopen()을 사용

  12. 파일 open에 대한 오류 처리 파일 열기에서 실패 : 읽으려는 파일이 존재하지 않는 경우 디스크 상의 물리적인 오류 등 파일 열기(함수 fopen)에서 실패할 경우에는 NULL을 반환하고, 파일과 관련된 어떠한 작업도 처리할 수 없으므로 프로그램을 종료하는 함수 exit()을 사용한다.

  13. [단계 2] 파일 쓰기와 파일 읽기 파일 처리를 위해 파일을 open할 때 오류가 발생하지 않았다면 파일 쓰기나 파일 읽기 작업을 할 수 있는데 이때 파일 입출력 라이브러리 함수를 사용 바탕색이 표시된 함수들은 ANSI 표준 입출력 함수들은 아니지만 헤더파일 <conio.h>를 필요로 하며 Turbo C++나 Visual C++에서 모두 사용이 가능

  14. [단계 3] 파일 닫기 파일 쓰기나 파일 읽기 처리가 모두 끝났다면 프로그램을 종료하기 전에 열려진 파일들을 모두 닫아 주어야 한다. 프로그램 내에서 파일이 닫혀 지지 않은 상태에서는 그 파일을 다시 열수 없다.

  15. [참고] 구조체형 FILE은 어떤 구조로 정의되어 있는가? 구조체 형 FILE은 사용하는 버퍼, 버퍼의 크기와 현재 위치, 접근하고 있는 파일의 이름 등의 정보를 포함한다. 고수준의 파일 입출력 함수들은 모두 구조체 형 FILE 의 내용을 참조하여 처리되므로 프로그래머는 이 구조체의 멤버들을 세부적으로 다룰 필요가 없으며, 입출력 함수에 대해 포인터만 넘겨줌으로써 파일 처리가 이루어진다.

  16. [참고] 파일을 다루는데 있어서 구분해야 할 내용들 순차 처리 방식은 텍스트 파일을 대상으로 하고, 랜덤 처리 방식은 이진 파일을 대상으로 한다.

  17. 17.2.1 텍스트 방식의 파일 입출력 함수 이 함수들은 모두 헤더파일 <stdio.h>를 필요로 하므로 별도의 헤더파일을 불러올 필요는 없다.

  18. 17.2.2 문자 단위의 파일처리 □ 문자 단위의 파일 출력 프로그램에서 만들어진 데이터를 파일에 저장하기 위해서는 함수 fopen()의 인자로 출력할 파일의 이름과 파일 출력 모드인 "w"(write)를 사용 문자단위의 파일 출력 함수

  19. 문자 단위의 파일 출력(getchar, fputc) 키보드로부터 문자를 입력 받는 함수 getchar()를 사용. Enter가 사용되기 이전까지 입력된 문자를 파일 출력함수 fputc()를 이용 하여 차례대로 파일 "chr.txt"에 출력

  20. [참고] 텍스트 방식으로 만들어진 파일의 내용을 확인하는 방법 텍스트 방식의 파일은 파일의 확장자를 txt로 가정한다. 파일의 확장자가 txt로 만들어진 파일들은 윈도우 탐색기로 double click만 해도 메모장(notepad) 프로그램이 자동으로 실행되어 파일의 내용을 확인할 수 있다. [예제 17-01]에서 만들어진 출력 파일 "chr.txt"은 원시 프로그램이 저장된 폴더에 생성되어 있다. double click

  21. 문자 단위의 파일 입력 □ 문자 단위의 파일 입력 파일 입력 즉, 파일에 저장된 데이터를 프로그램을 통해 읽기 위해 함수 fopen()의 인자로 읽을 파일의 이름과 파일 입력 모드인 "r"을 사용 문자단위의 파일 입력 함수

  22. 문자단위의 파일 입력(fgetc, EOF) 앞서 [예제 17-01]에서 생성한 파일 "chr.txt"를 입력 함수 fgetc()를 사용하여 문자 단위로 읽고 그 내용 을 화면으로 출력하는 프로그램 함수 getc() 또는 fgetc()는 파일로부 터 문자를 읽다가 파일의 끝에 도달 했다는 사실을 발견하면 EOF라는 특별한 값을 반환

  23. 문자단위의 파일 입력(getc, feof) 함수 feof()는 파일의 끝을 읽었다면 0이 아닌 숫자를 반환하고, 그렇지 않 은 경우에 0을 반환. 따라서 파일에서 데이터를 읽는 동안 에는 반복문 while의 조건식이 참이 되어야 하고, 파일의 끝을 읽었다면 조건식이 거짓이 되어 순환을 멈추어 야 하기 때문에 함수 foef()앞에 부정 을 뜻하는 논리 연산자 !을 사용

  24. 17.2.3 문자열 단위의 파일처리 문자열 : 2개 이상의 문자가 연속된 문자들 문자열을 파일로 출력하는 함수로는 fputs()를 사용 파일 출력함수인 fputs()는 자동으로 \n을 출력하지 않으므로 파일 출력에 있어서 출력할 내용의 line을 구분하고 싶다면 문자열의 마지막에 \n을 써 주어야 한다. 표준 출력함수인 puts()는 인자로 주어진 문자열을 화면에 출력한 다음 자동으로 \n을 같이 출력한다.

  25. 문자열 단위의 파일 출력(fputs) 화면으로 출력되는 결과는 없으며 프로그램이 위치한 폴더에 Wordlcup.txt라는 파일을 생성

  26. 문자열 단위의 파일 입력 함수 fgets()는 파일로부터 행 단위의 문자열을 읽는데 사용하는 함수 데이터를 문자열로 읽을 때 함수의 인자로 지정한 문자열의 최대 길이 이전에 줄 바꿈 \n을 만나면 그때까지의 문자열에 NULL 문자(\0)을 추가하여 문자열 포인터에 저장. 지정한 최대 길이 n보다 긴 문자열에 대해서는 n-1까지의 문자열만 저장하고, 나머지 문자열은 다음 문자열로 읽는다.

  27. 문자열 단위의 파일 입력(fgets) 앞의 [예제 17-04]에서 생성한 출력 파일 "worldcup.txt"를 입력 함수 fgets()를 사용하여 행 단위의 문자열로 읽고, 그 내용을 화면으로 출력하는 프로그램. 파일 "worldcup.txt"의 내용은 [그림]과 같으며, 읽을 최대 길이의 문자열 은 "Germany"로서 문자열의 최대 길이는 7

  28. 17.2.4 입출력 형식을 지정하는 파일 처리 □ 파일 출력 형식 지정 형식을 지정한다는 의미는 화면 출력 함수인 printf()에서 변수의 데이터 형에 맞게 형식 지정자인 %d, %f 또는 %s등을 사용하여 출력할 데이터의 형식을 지정한다는 의미. 파일 출력함수의 하나인 fprintf()는 함수의 첫 번째 인자로 파일 포인터가 사용되는 것을 제외하고는 그 사용법이 화면 출력함수인 printf()와 동일함.

  29. 출력 형식을 지정하는 파일 출력(fprintf)

  30. 파일 입력 형식 지정 파일에 저장된 데이터를 주어진 형식에 맞게 읽는 함수 fscanf() 함수의 첫 번째 인자로 파일 포인터가 사용된다는 것 외에 입력함수인 scanf()와 사용방법이 동일

  31. 입력 형식을 지정하는 파일 입력(fscanf) 파일 "2006cup.txt"로부터 파일입력 국가 이름은 문자열로 읽고, 득점수는 숫자로 읽기 위해 형식 지정자를 사용할 수 있는 fscanf()를 사용. 득점수의 합을 누적한 결과를 출력

  32. 17.2.5 키보드(콘솔)입력과 파일 출력 키보드(콘솔) 입력 함수인 scanf()를 사용하여 입력 받은 데이터를 파일로 출력하는 경우 함수 scanf()는 키보드를 통해 입력 받은 내용을 버퍼라는 임시 기억 장소에 보관. 따라서 반복문에서 연속적으로 scanf()를 사용하여 데이터를 입력 받게 되면 버퍼에 남아있는 내용이 다음에 입력 받을 데이터에 영향을 줄 수 있기 때문에 버퍼의 내용을 비워 주어야 하고, 이때 사용하는 함수가 fflush()

  33. 학생 세 명에 대한 이름과 성적을 함수 scanf()를 통해 키보드(콘솔)로 입력 받아 텍스트 방식의 파일로 출력하는 프로그램 출력할 파일의 이름은 "grade01.txt"로서 전처리기 #define을 사용하여 매크로 상수인 filename에 저장 키보드(콘솔)입력과 파일 출력(#define, scanf, fflush)

  34. 데이터의 개수가 정해지지 않은 경우의 파일 출력 파일 출력에 있어서 프로그램에서 입력할 데이터의 개수가 몇 개가 되는지 미리 알 수 없는 경우에는 반복문 while의 조건식을 다음과 같이 줄 수 있다. 함수 scanf()는 정상적으로 입력된 항목의 숫자를 반환한다. 그러나 파일의 끝 또는 문자열의 끝에서부터 읽은 경우(Ctrl-Z)에는 EOF를 반환하므로 scanf()가 반환한 값이 0보다는 커야 성공적으로 읽은 것입니다. 키보드로 Ctrl-Z를 입력하더라도 Enter를 해야 하므로 위와 같은 경우라면 Ctrl-Z와 Enter를 누르는 동작을 두 번 해야만 반복을 종료한다.

  35. [추가 문법] 17.3 이진 방식의 파일 다루기 파일 처리 프로그램이 있는 폴더에 "names.bin"라는 이진 파일을 읽는 작업을 처리할 때 또는 이진 파일로 출력할 때 fopen()을 다음과 같은 방법으로 사용

  36. 이진 파일 처리방식 모드(mode)의 구분

  37. 17.3.1 이진 방식의 파일 출력 이진 방식의 파일을 만들기 위해서 사용할 수 있는 파일 쓰기 함수 fwrite() 구조체와 같은 block 단위의 데이터를 처리할 때 사용. 함수 fwrite()로 만들어진 출력 파일은 읽을 때 이진 파일 읽기 함수인 fread()를 사용한다. 함수 fwrite()는 파일 쓰기가 성공적으로 처리되었을 경우 파일에 기록한 block의 개수를 반환하며 입력 함수 fread()는 파일 읽기가 성공적으로 처리되었을 경우 읽은 block의 개수를 반환

  38. fprinft()와 fwrite() 이진 파일 출력에 사용하는 fwrite()는 구조체 형과 같이 사용자 정의의 데이터 형을 포함한 모든 데이터 형에 사용할 수 있으며, 구조체의 block 단위로 처리할 수 있으므로 편리하게 사용할 수 있습니다. 다음과 같은 구조체 student에 대해 st라는 구조체 변수가 있다고 한다면 fprintf()와 fwrite()를 사용하는 경우의 차이점 이진 파일에서는 데이터의 단위를 block으로 처리하며 선언된 구조체 변수 st를 하나의 block으로 간주한다.

  39. 이진 방식의 파일 출력(fwrite)

  40. 17.3.2 이진 방식의 파일 입력 함수 fwrite()로 만들어진 출력 파일은 읽을 때 이진 파일 읽기 함수인 fread()를 사용. 입력 함수 fread()는 파일 읽기가 성공적으로 처리되었을 경우 읽은 block의 개수를 반환.

  41. 이진 방식의 파일 입력(fread)

  42. [참고] 텍스트 방식으로 저장된 파일을 이진 방식으로 읽을 수 있는가? 물론 읽을 수 있다. 단, 텍스트 방식에서는 byte 단위로 처리되므로 텍스트 방식으로 저장된 파일을 이진 방식으로 파일을 읽을 때는 fread() 대신에 byte 단위의 fgetc()를 사용한다. 추가로 파일에서 줄을 바꾸기 위해 입력한 Enter키(\n)에 대해서도 텍스트 방식은 파일에 저장할 때 CR(Carrage return)과 LF(Line Feed)의 제어문자 쌍으로 변환하여 저장하고, 읽을 때는 반대로 처리하지만 이진 방식은 어떤 변환도 사용하지 않는다. 마찬가지로 텍스트 방식에서 파일을 읽을 때 파일의 끝을 나타내는 Ctrl-Z(EOF)를 만날 때까지만 읽지만 이진 방식에서는 이 또한 하나의 데이터로 인식하므로 읽는 동작을 중단하지 않는다. 따라서 파일을 복사하는 프로그램을 만들 경우에 원본 파일이 텍스트 파일이건 이진 파일이건 이진 방식으로 파일을 open하고 1 byte 단위로 읽은 다음 다시 byte 단위인 fputc()를 사용하여 출력하는 방법을 이용한다.

  43. 17.4 원하는 블록의 위치에서 파일 읽기와 쓰기가 가능한 랜덤 처리 방식 파일 처리방식 : 순차 접근(sequential access)처리와 랜덤 접근(random access)처리 순차 접근(sequential access)처리: 카세트테이프 랜덤 접근(random access)처리: CD나 DVD 원하는 데이터의 위치를 임의로 찾아 처리하는 방식 이진 방식의 파일 처리에서 함수 fwrite()나 fread()는 같은 크기의 block 단위로 처리. 따라서 파일에서 이동하고자 하는 위치 즉, block의 위치를 선택하여 파일로부터 읽거나 파일에 저장할 수 있다. 이와 같은 방식을 랜덤 접근이라 한다.

  44. 함수 fseek()과 ftell() 함수 fseek() : 파일 포인터를 원하는 block의 위치로 이동 함수 ftell() : 파일의 시작 위치로부터 현재의 파일 포인터까지의 거리를 byte 크기로 환산. ftell()은 파일의 크기나 파일에 저장된 전체 block의 개수를 계산하는데 사용

  45. fseek()에서의 파일 포인터 이동 위치

  46. Block의 위치와 fseek() 예를 들어 첫 번째 block의 위치는 파일의 처음 위치와 동일. 두 번째 block의 위치는 파일 포인터의 기준 위치를 파일의 시작위치(SEEK_SET)로 하느냐 또는 파일의 마지막 위치(SEEK_END)로 잡느냐에 따라 offset의 크기가 달라진다. 다음의 그림에서 block의 크기 즉, 구조체의 크기는 10 byte로 가정하, 하나의 □가 한 개의 block을 나타낸다고 가정.

  47. 함수 ftell()과 block의 개수 계산 함수 ftell()은 파일의 처음(시작)위치에서 현재의 파일 포인터 위치까지의 거리를 byte 크기로 반환. 따라서 파일의 크기를 byte로 표시하거나 파일에 몇 개의 block이 저장되어 있는가를 계산할 때 다음과 같이 사용. 우선 파일 포인터의 위치를 파일의 마지막 위치(SEEK_END)로 이동(offset의 크기는 0)시킨 다음, 파일의 처음(시작)위치에서 현재의 파일 포인터의 위치까지의 거리를 byte 수로 환산하는 함수 ftell()로 계산하여 이 값을 block(구조체)의 크기로 나누어준다.

  48. 17.4.1 파일 포인터의 위치를 이동하는 파일 입력 다음의 예제는 앞의 [예제 17-10]에서 생성한 이진 파일 d-group.bin을 읽어 파일에 몇 개의 block이 저장되어 있는가를 출력하고, 이동하려는 block의 위치를 입력 받아 랜덤 접근에 의해 해당 위치의 데이터를 구조체 단위(block)로 읽은 다음 출력하는 프로그램 [예제 17-12] 다음 page 계속

  49. 랜덤 접근의 포인터 이동을 이용한 파일 입력(fseek, ftell, fread)

  50. [단원정리] 1/3 파일을 다루는데 있어서 프로그래머가 구분해야 할 내용 텍스트 파일과 이진 파일의 차이점은? 텍스트 방식은 데이터를 파일에 저장하거나 파일로부터 읽을 때 ASCII 코드에 대응되는 byte 단위로 처리하고, 이진 방식은 텍스트 방식과는 달리 데이터를 파일에 저장하거나 파일로부터 읽을 때 데이터 형(type)에 기준하여 처리한다.

More Related