<1 >

1

stream : 문자들의 흐름

file : 입출력이 가능한 모든것들에 대한 논리적 개념

 

2 file 을 사용하는 과정 : 스트림열기(fopen) -> 사용 -> 스트림 닫기(fclose)

 

 

<2>

1.

1)파일 열기 : FILE *fopen(const char *filename) , const char*mode);

*fimename: 읽어들일 file 이름

*mode : 파일에 대한 접근 방식

**file이 해당 프로젝트의 소스파일 안에 있을 경우 경로를 입력하지 않아도 된다.

 

 

2)mode : file 접근방식

"r": file을 읽기 전용으로 개방함 .                                     파일이 현재 존재 x 경우 에러가 발생했다는 의미로 NULL이 반환됨

"w": 현재의 내용을 파괴하고 쓰기 전용으로 개방함.             파일존재 x 경우 새로운 file 생성하고 쓰기전용으로 개방

"a" : 겹쳐쓰지 않고 기존 file 의 끝에 쓰기로 개방함.            파일존재 x 경우 새로운 file 생성하고 쓰기전용으로 개방 

"r+": file 을 읽기와 쓰기용으로 개방함.                             파일존재 x경우 에러가 발생했다는 의미로 NULL반환

"w+" : 현재의 내용을 파괴하고 읽기쓰기로 개방함.             파일존재 x경우 새로운 file을 생성하고 읽기쓰기용으로 개방

"a+" : 겹쳐쓰지 않고, 기존file의 끝에서 읽기, 쓰기로 개방함     파일존재 x 경우 새로운 file을 생성하고 읽기쓰기용으로 개방

 

 

 

3) 파일 닫기 : int fclose(FILE *fp);

fp: 읽어들임 작업을 마칠 file의 포인터

 

 

 

 

2. 파일 사용

1) file 출력 - 파일데이터 저장

-문자 : int fputc(int c, FILE *fp);

-서식화 출력 : int fprintf(FILE *fp, const char *format, ... );

-블록 출력 : size_t fwrite(const void *ptr, size_t size , size_t n, FILE *fp);

-문자열 출력 : int fputs(const char *s, FILE *fp);

 

 

2)file 입력 - 파일데이터 읽음

-한문자 입력 : int getc(FILE*fp);

-서식화 입력 : int fscanf(FILE *fp , const char*format,...);

-블록 입력 : size_t tread(void *ptr, size_t size, size_t n, FILE *fp);

-문자열 입력 : char *fgets(char *s, int n, FILE *fp);

 

 

 

3. 예

1) 입력 문자열 파일 쓰기

 

원래는 파일이 없었는데 w mode로 파일을 열어서 text파일이 생겼다.

 

 

결과 :

 

 

 

 

 

 

 

 

2) 파일 문자열 변수 저장

 

 

 

- file출력 과정에서 처음부터 0을 입력한 경우 :

test 파일이 없는 상태에서 시작했는데 test 파일이 생겨났고(파일여는과정에서 생김) 파일안에는 아무 내용도 없다.

 

 

 

- 여러 숫자 입력 :

 

 

-파일 출력 과정을 주석처리한 경우 : test파일이 생겨나지 않고 파일 입력 과정이 이뤄지지 않았다.

 

 

 

 

 

'언어 > C' 카테고리의 다른 글

3.31 구조체  (0) 2017.04.03
3.30 포인터2  (0) 2017.03.31

1. 구조체의 정의 

: 여러 자료형으로 메모리의 연속된 공간을 할당받아 사용하는 사용자정의 자료형 

-메인함수에서 호출할 때 자료형이 정의한 구조체 이름으로 쓰인다.

struct tag_name{


type 변수명;

type 변수명;

...
};

*struct : 구조체를 정의하기 위해 사용되는 자료형

*tag_name: 구조체를 구분하기 위해 사용되는 이름

*type : 각 원소들의 자료형

*변수명 : 구조체 원소, 멤버, 구성요소에 대한 이름



1) 구조체 선언 

#include <stdio.h>


struct phone{

char name[20];

int price;

};


void main()

{

struct phone phData={"스마트폰",2000};

}





or





typedef struct phone{

char name[20];

int price;

}PHONE;


void main(){

PHONE phData={"스마트폰", 2000};

}


*선언의 이용






2) 구조체 데이터 출력



3) 구조체 데이터의 복사



2. 중첩구조체 

: 구조체가 다른 구조체 변수를 포함하는것 ( 구조체 변수가 필드가 되는 형태) - 복잡한 자료형을 만드는데 있어서 편리함

( 다중구조체 or 포함구조체)



1) 기본형식




2)응용예시






3. 구조체 배열 : 구조체를 배열로 이용









4.구조체 포인터 

1) 구조체포인터의 선언


or




2) 구조체 포인터의 응용



-화살표 연산자 :  구조체포인터에서 구조체의 멤버를 역참조할때 사용된다.

(포인터이름 ->멤버이름) 

= ( *포인터명).멤버이름 과 같다.

-구조체의 멤버가 포인터일때 역참조법 :  

*구조체명.구조체안의포인터명 or *(*구조체의포인터명).구조체안의 포인터명


// 맨 앞의 * 가 가장 마지막에 실행된다. 








5. 포인터와 함수





실행순서 : main - (PHONE ph) - show 


** 자료형이 PHONE 임에 주의 





6. 자기참조 구조체 : 

-자기 자신을 가리키는 포인터를 멤버로 가지는 구조체 

-리스트, 트리 등 연결리스트 자료구조 구현에 사용


1) 기본 형식 




2) 응용





출처 ) KGITBank,  http://killernet.egloos.com/2380691


'언어 > C' 카테고리의 다른 글

4.3 파일입출력  (0) 2017.04.04
3.30 포인터2  (0) 2017.03.31

1. 포인터1복습

2. 포인터변수명에 상수 더하기

3. 배열과포인터

4. 주소전달방식

5. 퀴즈

 

 

 

 

1.

1) 포인터 선언과 초기화 , 역참조

 

역참조 (*포인터명) 포인터가 가지고 있는 주소값으로 가 그 공간안에 들어있는 값을 가져온다.

 

2)포인터 크기

 

 32비트 체계에서는 모든 포인터의 크기가 4byte 이다 (64비트 체계에서는 8비트)

 

 

 

 

 

 

 

2. 포인터변수에 상수 더하기(포인터변수명 + n)

: (포인터에 저장된 주소값 + 자료형크기 * n)

** int : 4byte , double : 8byte , float : 4byte , char : 1byte

 

 

 

 

 

 

 

 

 

3. 포인터와 배열

1)배열명은 배열이 시작하는 시점의 주소를 갖고있는 상수이다.

 

-선언과 초기화 방법

 

 

 

2)1차배열의 경우 *(포인터명 + 원소번호), 포인터명[원소번소]로 값에 접근할 수 있다

 

(가정 : 배열은 주소 100부터 시작하고 포인터P=a; 과정을 마친상태)

 P(100)   P+1(104)   P+2(108)   P+3(112)    P+4(116)        --주소

 *P         *(P+1)    *(P+2)     *(P+3)      *(P+4)              --포인터
 a[0]         a[1]       a[2]        a[3]        a[4]                --배열
 10          20          30         40          50

 

 P=a , P+i = a+i  , *(p+i)=*(a+i) , P[i]=a[i]

 

(첫번째 printf문이 중요)

 

 

++)scanf_s에서의 주소입력에서의 포인터 사용

 

 

 

 

 

3)포인터배열

(pta의 시작주소가 100이라고 가정, a, b, c의 주소가 순서대로 들어있다고 가정)
   pta+0 -100                                 :  pta[0]의 주소(배열명은 다 주소)
 *(pta+0) -pta[0] - a의 주소 : pta+0이라는 주소에 들어있는 값 : pta[0]=&a
 *(*(pta+0)) -*pta[0]-*a의주소-a : pta[0]이라는 주소에 들어있는 값=a
 

 

 

 

 

 

 

 

 

4. 주소전달방법(함수에서 이용): 참조에 의한 전달 -call by reference *포인터이용
-호출함수의 변수 주소를 넘겨주는 방식이다
-호출함수의 변수에 영향을 줄 수 있다
-여러개의 결과값을 호출함수로 돌려주는 효과가 있다 (원래 리턴은 한개만 할수 있음 )

 

**일반적인 전달 방식 : 값에 의한 전달 = call by value
-호출함수의 변수값을 복사해서 전달하는 방식
-호출함수의 변수에는 아무런 영향을 주지 않는다

1.인자값으로 주소넘겨주는 외부함수 안에서 메인함수 안의 그 주소값에 해당하는 변수를 이용할 수 있다
2.주소값을 보냈을 때는 변수가 변할수도 있으니 하나하나 확인해줘야 한다.

 

 

 

 

 

 

 

*퀴즈 풀어보기*

 

 

'언어 > C' 카테고리의 다른 글

4.3 파일입출력  (0) 2017.04.04
3.31 구조체  (0) 2017.04.03

+ Recent posts