메모리_누수 를 알 수 있는 방법. vld라는 라이브러리를 사용하거나, 코드로 찾아내기도 함.
_CrtDebugFlag 함수와 헤더를 넣어야 함.
msdn에서 찾아볼 것.(누수는 그때그때 잡아야 함.)
입출력 코드보다 개념이 중요함.
입출력의 3가지
- 콘솔 입출력
- 파일 입출력
- 소켓 입출력 (네트워크 - 서버)
콘솔입출력 스트림 : 프로그래밍 상의 흐름. 단방향성이라는 특징이 있음.
버퍼 : 무언가를 저장하는 메모리 블럭 중앙처리 장치 CPU가 입력과 출력을 상시적으로 대기하고 있게 된다면 다른 프로그램을 구동하고 있을 수 없기 때문에, 임시적으로 저장하고 있는 공간이 필요한 것. ex _ 커서가 깜빡거리는 것은 입력 버퍼가 입력을 대기하고 있는 것.
입출력 모드
- 텍스트 모드 : 입출력의 결과 상태를 오로지 문자열 형태로 지원
- 바이너리 모드 : 입출력의 결과 상태를 오로지 이진수 형태로 지원
문자열 입출력 함수
오로지 문자열만 입력과 출력만 담당하는 함수.(문자열만 입출력할 때 효율적) 문자열 입력 함수는 모두 텍스트 모드임
- 콘솔 기반 전용 함수 콘솔 입출력 시에만 사용
- 공용 함수 모든 입출력 상황에서 사용이 가능(콘솔/소켓/파일)
(콘솔 기반) 단일 문자 출력 함수(아스키 코드 문자)
putchar(65) => 'A'
(공용) 단일 문자 출력 함수
fputc(아스키코드, 스트림)
fputc(66,stdout)
콘솔 입출력 시 사용 가능한 스트림 종류
stdin : 표준 입력 스트림(키보드)
stdout : 표준 출력 스트림(모니터)
stderr : 표준 에러 스트림(모니터)
(콘솔 기반) 단일 문자 입력
char name = getChar();
(공용) 단일 문자 출력
char Name = fgetc(stdin);
fputc(Name,stdout)
EOF (-1로 매크로화 되어있는 상수. End Of File : 파일의 끝을 의미하는 상수) (콘솔 입출력 시 ctrl -z 가 eof를 발생시킴)
(콘솔 기반) 문자열 출력
puts("hellp");
cin 은 공백을 입력받을 때에는 입력처리를 진행하지 않으나, puts는 가능 또한 자동 개행을 제공함
(공용) 문자열 출력
fputs("hellp",stdout);
자동 개행을 제공하지 않음. 파일 입출력도 함께 지원하다보니 바이너리 모드의 특성을 지니고 있음.
cout의 endl은 텍스트 모드일 때, 바이너리 모드일 때 다름.
텍스트 모드 : \r \n → 캐리지 리턴(맨앞으로 커서를 땡긴다.)
바이너리 모드 : \n → 캐리지 리턴 없음
문자열 입력 함수
콘솔기반 문자 입력
gets_s : 반환 타입이 char*
gets_s(문자열, 크기)
→ 용량보다 큰 문자열이 입력되면 에러
fgets
fgets(문자열, 크기, 스트림)
읽어들일 수 있는 만큼만 읽음. 또한 엔터도 읽음
fflush(stdout) : 출력 버퍼 비우기 함수
버퍼 비우기는 왜? 필요한가?
입력 받을 때 입력 버퍼를 지우지 않으면 오바한 데이터가 다음 변수에 들어갈 수 있음.
파일 입출력의 단계
-
파일 개방(스트림 생성 → 핸들 생성)
-
파일 입출력 함수 호출() 핸들? → 윈도우의 체제와 관련됨. (윈도우의 리소스 : 프로세스 /쓰레드 / 파일) 파일을 변경하면 윈도우는 어디서 어떻게 언제 바뀌었는지 알고 있어야 함. 그런데 그걸 어떻게 알아?
모든 리소스에는 윈도우가 고유 식별번호(ID)를 부여하게 됨. 이런 16진수 정수로 이루어진 식별 번호를 핸들이라고 부름.
-
개발한 파일 소멸
파일 개방 함수
FILE * pfile = NULL;
fopen_s(파일 포인터,경로,모드)
상대 경로 : 프로젝트 파일을 기준으로 현재 파일의 위치까지 표기한 상태
절대 경로 : 드라이브 명부터 현재 파일까지 모두 표기한 상태
입출력 모드 (ex rt )
r - 읽기 가능 (파일 x - 에러)
w - 쓰기 가능 (파일 x - 생성)
a - 파일의 끝에 덧붙여 쓰기 가능 (파일 x - 생성)
r+ - 읽기/쓰기 가능 (파일 x - 에러)
w+ - 읽기/쓰기 가능 (파일 x - 에러)
a+ - 읽기/덧붙여 쓰기 가능 (파일 x - 에러)
------
t- 텍스트 모드
b - 2진 모드
FILE * pfile = NULL;
errno_t err = fopen_s(&pFile,"../Data/Test.txt","wt"); //개방
//파일 쓰기
if(0 = =err){
fputs("world",pFile); //함수 호출
}
fclose(pFile);
FILE * pfile = NULL;
char szBuffer[]="";
errno_t err = fopen_s(&pFile,"../Data/Test.txt","rt"); //개방
if(0 = =err){
szBuffer = fgets(szBuffer, sizeof(szBuffer),pFile); //함수 호출
fputs(szBuffer,stdout); //함수 호출
}
fclose(pFile);
파일 입출력 함수(텍스트모드)
fseek : 파일 커서를 강제로 이동시키는 함수
fseek(파일스트림, 이동할 바이트 수, 커서의 시작 지점);
ftell : 현재 파일의 지시자(커서)의 위치, 0부터 시작.
ftell(파일스트림)
FILE* pfile =NULL;
errno_t err = fopen_s(&pFile, "../data/test.txt","rt");
fseek(pFile,3,SEEK_SET);
ftell(pFile); // 4
feof : 파일 지시자(커서)가 eof에 도달했는지 검사하는 함수.
(끝에 도달 시 0이 아닌 값을 반환.)
feof(파일 스트림)
파일 입출력 함수(바이너리 모드)
fwrite
fwrite(저장(출력)할 메모리의 시작 주소, 출력할 메모리의 사이즈, 출력할 메모리의 개수, 스트림);
fread
fread(불러우기(입력)할 메모리의 시작 주소, 입력할 메모리의 사이즈, 입력할 메모리의 개수, 파일 스트림);