<파일 입출력>

파일로부터 입력을 받고출력을 받는 것이다.

지금까지는 키보드로 부터 혹은 모니터에다가 출력을 하고 입력을 받았다. 프로그램을 만들면 그 프로그램 중 데이터가 만들어지면 데이터를 메모리에 보관해서 사용했다. 메모리에 저장된 데이터는 프로그램이 종료되면 사라졌다. 이런 데이터들을 일일이 저장하는 방법이나, 프로그램이 종료된 후에도 계속 사용하고 싶으면 어떻게해야할까... 바로 파일을 이용하면 된다.

 

1. 파일 스트림을 생성

파일 스트림을 생성하려면 파일 포인터가 필요하다. 파일 포인터는 파일에 접근하는데 사용되는 FILE구조체를 의미하는데, 그 동작을 해주는 함수가 fopen()함수이다. 쉽게말해 파일 스트림의 실체가 파일 포인터라고 생각하자.

2. 파일을 연다.

3. 파일 입출력 수행

파일 입출력에 사용되는 함수들은 종류가 많다. 추후에 알아보자.

4. 파일을 닫는다.

파일을 열고 작업을 수행했으면 파일을 닫아야 하는데 그 때 사용되는 함수가fclose()이다.

이 순서대로 진행이 된다.

 


<fopen()함수, fclose()함수>

fopen(파일의 경로, 파일 열기 모드)

ex) fopen("D:\\project\\kyg\\data.txt", "rt");

앞에 인자는 파일의 경로를 넣어주면 된다.

뒤에 인자는 파일 열기 모드인데, 이 모드에는 3가지가 있다.

r : 읽기 전용 파일로 열고, 파일이 없거나 찾을 수 없으면 호출 실패

w : 쓰기 전용 파일로 열고, 파일이 있으면 파일의 내용을 모두 지우고 새파일을 쓰게된다파일이 없거나 찾을 수 없으면 새로운 파일을 생성해서 데이터를 쓴다.

a : 추가 쓰기 전용파일로 열고, 지정한 파일이 있으면 파일의 끝에서부터 내용을 추가한다.

 

t : 텍스트 파일 모드이다.

b : 바이너리 파일 모드이다.

위에 "rt"를 해석하면 읽기전용 파일로 열고 텍스트 파일 모드이다.

 

 

<실습>

-결과-

LIST

<스트림(stream)>

스트림이란 데이터를 입력하고 출력하기 위한 다리이다.

키보드 ---- 프로그램 ---- 모니터

이 세개는 전혀 다른 개체이다.

그렇다면 이 사이에 연결하려면 다리같은 것이 필요한데 그것이 스트림이다. ---- 이것이 스트림...

키보드로 데이터를 입력하면 표준 입력 스트림이 필요하고, 모니터로 데이터를 출력하려면 표준 출력 스트림이 필요한 것이다. 스트림은 운영체제에 의해서 만들어지는 것인데, 그냥 가상의 다리?라고 생각하자.

stdin : 표준 입력 스트림을 가리키는 다리이름.

stdout : 표준 출력 스트림을 가리키는 다리이름.

 

그렇다면 과연 이것들은 언제 생성되고 소멸될까?

그것은 바로 해당 프로그램 시작시 생성시키고, 종료시 소멸시킨다.

키보드 --(stdin)--> 프로그램 --(stdout)--> 모니터

이런 방식으로 우리는 여태껏 printf()scanf()를 사용하면서 스트림을 만들었다.

 

그렇다면 이 방법을 파일에다가 적용시키면 어떻게 될까?

파일 --(파일 입력 스트림)--> 프로그램 --(파일 출력 스트림)--> 파일

이렇게 나타낼 수 있을 것이다.

 


<버퍼(buffer)>

버퍼란 처리할 데이터를 임시로 저장하는 저장소이다. ... 데이터 처리속도와 생성속도가 다르면 어떻게 될까? 무조건 낮은 쪽에 맞춰줘야한다. 이렇게 되면 너무 손해보는 장사가 아닐까...

이런 단점을 없애기 위해 버퍼라는 것이 존재한다. 그 속도차이를 메워 주기 위한 임시 저장공간인 것이다.

키보드 --(stdin)--> 입력버퍼에 저장 ----> 프로그램

프로그램 ----> 출력버퍼에 저장 --(stdout)--> 모니터

 


<버퍼링(buffering)>

버퍼링이란 버퍼를 활용하는 방식 또는 버퍼에 저장하는 것을 말한다. 예를 들어 프린터와 같은 출력 장치로 데이터를 전송한다고 가정하자. 그렇다면 프린터로 그 데이터들이 가기전에 버퍼라는 공간에다가 데이터를 잠시 저장해준다. 직관적으로 봐도 모니터가 출력해나가는 속도와 컴퓨터가 데이터를 전송하는 속도는 어마어마한 차이가 있기 때문이다. 이 속도 차를 줄여주기 위해 있는 것이 버퍼이다.

LIST

<rand()함수>

rand()함수는 난수를 발생시키는 함수이다.

아무 숫자가 한 개를 출력한다.

범위는 0~32767이다.

내가 나타내고 싶은 범위를 나타내고자 할때는 %연산자를 이용하면 쉽게 나타낼 수 있다.

예를 들어 주사위 1~6범위를 하고싶다면...

rand() % 6 = 0~5 범위가 나오는데 여기에 +1을 해준다

(rand() % 6) + 1 = 1~6이다.

stdlib.h헤더파일을 포함해야한다

 


<srand()>

rand()함수의 단점은 매번 같은 값밖에 안나온다... 그렇다면 난수를 나타내고자 하는데 매번 같은 값이 출력된다면 의미가 없을 것이다.

srand()는 괄호 안에 seed값을 넣어주면 매번 다른 숫자가 출력된다.

srand(10), srand(20)이렇게 넣어주면 다른 숫자들이 출력된다.

tdlib.h헤더파일을 포함해야한다

 


<실습>

로또 번호 프로그램을 만들어보자.

Tip) time.h헤더파일을 이용해보자. (저 위에 seed값을 매번 바꿔줄 수 있는 것은 뭐없을까? 바로 계속 변하는 시간을 이용하는 것이다.)

time(null)이라는 함수는 197011일부터 지금까지의 초를 계산한다. 그러므로 실행할 때 마다 시간이 다르기때문에 다른값이 나오게 된다.

 

-결과-

LIST

<atof()함수>

문자열을 double형 데이터로 변환시켜주는 함수이다. 이 함수를 사용하기 위해서는 stdlib.h파헤더파일을 포함해야 한다.

 

<atoi()함수>

문자열을 int형 데이터로 변환시켜주는 함수이다이 함수를 사용하기 위해서는 stdlib.h헤더파일을 포함해야 한다.

 

<atol()함수>

문자열을 long형 데이터로 변환시켜주는 함수이다이 함수를 사용하기 위해서는 stdlib.h헤더파일을 포함해야 한다.

 

<실습>

 


-결과-

LIST

'Programming > C' 카테고리의 다른 글

C언어 - 스트림, 버퍼, 버퍼링  (0) 2016.06.21
C언어 - rand()함수  (0) 2016.06.20
C언어 - sscanf()함수, sprintf()함수  (0) 2016.06.18
C언어 - strupr()함수, strlwr()함수  (0) 2016.06.17
C언어 - strchr()함수, strstr()함수  (2) 2016.06.16

<sscanf() 함수>

scanf()함수는 키보드로부터 입력받는 함수이다. 똑같은 개념으로 키보드가 아닌 메모리로부터 문자열을 입력받는 함수이다. 이 문자를 사용하기 위해서는 string.h 헤더파일이다.

 

<sprintf() 함수>

printf()함수는 모니터로 출력하는 함수이다. 똑같은 개념으로 모니터로 출력하는 것을 메모리에 다가 출력하는 것이다.(저장한다고 보면 된다.)

메모리에 문자열을 출력하는 함수이다. 이 문자를 사용하기 위해서는 string.h 헤더파일이다.

 

<실습>

 

-결과-

LIST

<strupr()함수>

문자열을 대문자로 변경해주는 함수이다이 함수를 사용하기 위해서는 string.h를 포함해야 한다.

)

char arr1[10]="power";

strupr(arr1);    // arr1에 저장된 문자열을 모두 대문자로 변환하고 결과로 시작주소를 반환한다.

 

<strlwr()함수>

문자열을 소문자로 변경해주는 함수이다이 함수를 사용하기 위해서는 string.h를 포함해야 한다.

)

char arr1[10]="POWER";

strlwr(arr1);     // arr1에 저장된 문자열을 모두 소문자로 변환하고 결과로 시작주소를 반환한다.

 

<실습>

 

-결과-

LIST

<strchr()함수>

문자를 찾는 함수이다. 이 함수를 사용하기 위해서는 string.h를 포함해야 한다.

)

char arr1[10]="power";

strchr(arr1, 'o');    // arr1에서 문자 o의 메모리 주소를 검색한다. (결과값으로 메모리 주소를 반환한다.)

 


<strstr()함수>

문자열을 찾는 함수이다이 함수를 사용하기 위해서는 string.h를 포함해야 한다.

)

char arr1[10]="power";

strstr(arr1, "owr");     // arr1에서 문자열 owr의 메모리 시작 주소를 검색한다.

 

<실습>

 

-결과-

LIST

<strcat()함수>

문자열을 결합하는 함수이다이 함수를 사용하기 위해서는 string.h 헤더파일을 포함해야 한다.

)

char arr1[10]="very";

char arr2[10]="good";

strcat(arr1, arr2);       // arr1arr2문자열을 결합하여 verygood 된다.

 


<strncat()함수>

문자열을 결합하는 함수인데, 특정 바이트 만큼 결합이 가능하다.

)

char arr1[10]="very";

char arr2[10]="good";

strncat(arr1, arr2, 3);      // arr1arr2 문자열을 3바이트 만큼만 결하하여 verygoo가 됨

 

<실습>


-결과-

LIST

<strcmp()함수>

문자열을 비교하는 함수이다이 함수를 사용하기 위해서는 string.h 헤더파일을  포함해야 한다.

-비교표-


 

)

char arr1[10]="goodluck";

char arr2[10]="goodguy";

char arr3[10]="goodman";

 

strcmp(arr1, arr2);     // 문자열 arr1 문자열 arr2를 비교한다.

strcmp(arr1, arr3);     // 문자열 arr1과 문자열 arr3을 비교한다.

 

<strncmp()함수>

문자열을 비교하는 함수이다. , 원하는 구간까지만 비교 하고 싶을때 사용한다.



<실습>

 

 

-결과-

LIST

'Programming > C' 카테고리의 다른 글

C언어 - strchr()함수, strstr()함수  (2) 2016.06.16
C언어 - strcat()함수, strncat()함수  (0) 2016.06.15
C언어 - strcpy()함수, strncpy()함수  (0) 2016.06.13
C언어 - strlen()함수  (0) 2016.06.12
C언어 - gets(), puts()함수  (0) 2016.06.11

<strcpy()함수>

문자열을 복사하는 함수이다. 이 함수를 사용하기 위해서는 string.h 헤더파일을 포함해야 한다.

)

char arr1[10]="good";

char arr2[10];

strcpy(arr2, arr1);          // arr1의 문자열을 arr2에 복사한다.

 

 

<strncpy()함수>

문자열을 복사하는데, 지정한 범위만큼 복사한다.

참고로 good3바이트이면 goo까지만 복사하고 종료문자인 \0은 따로 저장해주지 않는다. 그래서 따로 넣어주어야한다.

)

char arr1[10]="good";

char arr2[10];

strncpy(arr2, arr1, 3);        // arr1의 문자열을 arr23바이트만큼만 복사한다.

 

<실습>

 

-결과-

LIST

'Programming > C' 카테고리의 다른 글

C언어 - strcat()함수, strncat()함수  (0) 2016.06.15
C언어 - strcmp()함수, strncmp()함수  (0) 2016.06.14
C언어 - strlen()함수  (0) 2016.06.12
C언어 - gets(), puts()함수  (0) 2016.06.11
C언어 - 공용체  (0) 2016.06.10

+ Recent posts