2016년 11월 28일 월요일

[C language] C 언어 기본 문법_3

[차례]

7. 문자와 문자열
8. 구조체
9. 파일 입출력



[7. 문자와 문자열 관련 함수]

1.스트림
stdin / 표준 입력 스트림 / 키보드 대상으로 입력
stout / 표준 출력 스트림 / 모니터 대상으로 출력
stderr / 표준 에러 스트림 / 모니터 대상으로 출력


2.
-문자 출력 함수
int putchar(int c)                 //인자로 전달된 문자를 모니터로 출력
int fputc(int c, FILE * stream)  //인자로 전달된 문자를 두번째 인자로 출력(모니터/파일)

-문자 입력 함수
int getchar()                        //문자를 키보드로 입력
int fgetc(FILE * stream)          //문자를 인자에 따라 입력(변수/파일 등)

함수가 int형인 이유는 EOF(end of file)이 int 형(-1)이기 때문이다. 


3.
문자열 출력 함수
int puts(const char * s)              
int fputs(const char * s, FILE * stream)

-문자열 입력 함수
char * gets(char * s)          //키보드로 매개변수(문자열)을 입력받는다. 
char * fgets(char *s, int n, FILE * stream) //(문자열, 입력받을 크기, 입력받을 타입)
       //10개의 문자들을 입력하면 9개가 저장된다. 마지막에 NULL이 추가되기 때문이다.
       //\n같은 개행문자로 하나의 문자로 인식하여 읽는다.


4.
출력버퍼를 비우는 fflush 함수
출력버퍼가 비워진다는 것은 출력버퍼에 저장된 데이터가 버퍼를 떠나 목적지로 이동됨을 뜻하기도 한다. 
int fflush(FILE * stream)
함수 성공시 0, 실패시 EOF


5. 
입출력 이외의 문자열 관련함수 
#include <string.h>

[ 크기반환(without null) ]
size_t strlen(const char *s) //문자열 길이를 반환, 널 문자는 길이에 포함하지 않는다.
                                   //sizeof(number) 함수는 널 문자를 길이에 포함한다.

[복사]
char * strcpy(char * dest, const char* src)              //scr->dest에 문자열 복사
char * strncpy(char * dest, const char* src, size_t n) //
Ex)
 char str[10]="123456789";  //마지막은 null이 저장되어야 한다.
char arr[5];
strncpy(arr,str,sizeof(arr)-1); //arr크기는 5이지만 null을 생각해서 4를 복사한다.
arr[sizeof(arr)-1]=0;           //마지막에 null문자를 넣어줘야 한다.
puts(arr);                        //정상 출력

[덧붙이기]
char * strcat(char * dest, const char * src)
char * strncat(char * dest , const char* src, size_t n); //n=7이라고 하면 null문자 합쳐 8
                                                    //null 문자가 저장된 위치에서부터 덧붙혀진다.

[비교]
int strcmp(const char * s1, const char * s2)  //문자내용이 같으면 0, 아니면 0아닌 값 반환
int strncmp(const char * s1, const char * s2, size_t n)  //부분비교



6.
그 이외의 변환 함수들

#include <stdlib.h>
int atoi(const char * str);       //문자열 내용을 int형으로 반환
long atol(const char * str);     //문자열 내용을 long형으로 반환
double atof(const char * str);  //문자열 내용을 double형으로 반환




[8. 구조체]

1. 정의
struct point{
 int x;
 double y;
}
void main(){
struct point pos;
pos.x = 10;
pos.y = 2.2;

//다른 초기화 방법 pos={10,2.2};
}

2.
구조체의 배열
struct point pos[3];
int i = 1;
pos[i].x=10;
pos[i].y= 2.2;
//또는 struct point pos[3]= { {10, 2.2}, {20, 3.3}, {40, 5.5} };

3.
구조체 변수 포인터
struct point pos= {10, 2.2};
struct point * ppos = &pos;
(*ppos).x = 20;                     //pos의 값을 20, 55로 바꾼다.
ppos->y= 5.5;

4.
typedef 선언

ex)typedef int NUMBER //int자료형을 NUMBER로 사용하겟다.
    void main(){
    NUMBER i = 20;
    }

이를 구조체에도 적용하면
typedef struct point{  //point는 생략가능하다. 그러나 'struct point pos' 변수 선언을 불가.
   int x;
   double y;
}Point
void main(){
  Point pos = {10, 2.2};
  }



5. 함수로의 구조체 변수

void function(Point pos){    //전달 매개변수
  printf.....
}
Point Getpos(void){           //반환형
....
return Point형 변수    
}


6. 구조체의 연산

-대입 연산은 가능하다.  Point pos1 ={1, 2}; Point pos2 = pos1;   (O)

-산술 연산은 정형화 할 수는 없다.
  Point pos1 = {2,5}; Point pos2 ={5, 1};
  pos1 += pos2;    (X)
  pos1.xpos+=post2.xpos;  pos1.ypos+=post2.ypos;   (O)


7. 공용체

- 구조체와는 메모리 공간에 할당하는 방식에서 차이가 있다.
- 다양한 접근방식을 제공

typedef struct{      //구조체   Size = 4+8=12byte;
 int p1;
 double p2;            
} Point;
typedef union{     //공용체   Size = 가장 큰 자료형 기준 = 8byte;
 int p1;              //한 곳의 메모리로 여러 변수들이 공용으로 사용한다.
 double p2;
} Upoint;


8. 열거형





[9. 파일 입출력]


1. fopen함수

-프로그램상에서 파일과의 스트림(다리)을 형성한다.

-#include <stdio.h>
  FILE * fopen(const char * filename, const char * mode);
  스트림 정보를 FILE이란 구조체(표준)에 담아 그 변수의 주소값을 반환한다.
  첫 번째 인자는 '스트림을 형성할 파일의 이름' , 두 번째는 '형성할 스트림의 종류'이다.


-Ex)컴파일 할 프로젝트에 'data.txt' 파일을 만든다.

FILE *fp = fopen("data.txt","wt");
if(fp==NULL){
puts("file open fail");      //파일이 존재하지 않을 시
return -1;   //비정상적 종료를 의미하기 위해 -1반환
}
fputc('a',fp);
fputc('B',fp);
fputs("hellow world",fp);
fclose(fp);    //스트림 종료


















2. fclose함수

-int fclose(FILE * stream);
 성공시 0, 실패서 EOF를 반환
 자원을 반환하고, 버퍼링 되었던 데이터 출력(fflush기능)



3.파일 개방모드(fopen의 두번 째 인자)

-r 읽기 기능   : 파일 없으면 에러
 w 쓰기 기능  : 파일 없으면 생성
 a 파일 끝에 덧붙여 쓰기 기능  : 파일 없으면 생성
 t : 문자데이터
 b : 바이너리 데이터 (음원, 동영상)

-Ex) rt는 문자데이터를 읽어라.  wb 이진데이터를 써라.



4. feof함수

-#include <stdio.h>
 int feof(FILE * stream)
 파일 끝에 도달한 경우 0이 아닌 값 반환

Ex)
FILE * src=fopen("src.txt","rt");
FILE * des=fopen("des.txt","wt");
char str[20];

while(fgets(str,sizeof(str),src)!=NULL)
     fputs(str,des);
if(feof(str)!=0)
   puts("success");
else
   puts("fail");

fclose(src);
fclose(des);


5. 바이너리 데이터 입출력 fread, fwrite

함수)
#include <stdio.h>
size_t fread(void * buffer, size_t size, size_t count, FILE * stream);
->성공시 전달 인자 count, 실패/파일 끝 도달시 count보다 작은 값 반환.

#include <stdio.h>
size_t fwrite(const void * buffer, size_t size, size_t count, FILE * stream);
->성공시 전달 인자 count, 실패/파일 끝 도달시 count보다 작은 값 반환.

//size*count만큼 데이터를 stream으로 읽고 buffer에 저장해라.
//size*count만큼 데이터를 buffer에 쓰고 stream에 저장해라. 



6. 파일 위치 지시자

-파일 구조체 멤버 중 파일의 위치 정보를 저장하고 있는 멤버. 함수가 호출 될 때마다 참조 및 갱신된다.

-파일 위치 지시자의 이동
#include <stdio.h>
int fseek(FILE * stream, long offset, int wherefrom);  //파일구조체, 이동크기, 기준점
->성공 시 0, 실패 시 0이 아닌 값을 반환

-wherefrom
SEEK_SET(0)   //파일 맨 앞에서부터 이동을 시작
SEEK_CUR(1)  //현재 위치에서부터 이동을 시작
SEEK_END(2)  //파일 맨 끝에서부터 이동을 시작


-현재 파일 위치 지시자의 위치
long ftell(FILE * stream);
->파일 위치 지시자의 위치 정보를 반환


댓글 없음:

댓글 쓰기