신규 블로그를 만들었습니다!
파일입출력을 사용하기 전에 스트림의 개념을 파악해보자
stream 스트림이란?
stream은 입출력이 가능하게 해주는 통로라고 생각하면 된다.
stream을 한글로 번역한다면 개울이라는 말이 된다.
개울처럼 물이 흐르는것과 같이 데이터가 흘러갈 수 있는 통로라고 생각하면 된다.
예를들어, 키보드를 통해 input값을 넣어주면 stream을 통해 프로그램의 buffer로 전송이 된다.
반대로, 컴퓨터에서 데이터를 내보낼때 또한 stream을 통해 output값을 넘겨준다.
여기서 buffer가 나오는데, buffer는 임시 저장 공간이라고 생각하면 된다.
이러한 저장공간이 필요한 이유는 결론적으로 부하를 줄이기 위해서다.
데이터 하나하나 stream을 통해 넘어오게 될텐데,
그 데이터마다 연산을 수행하다보면 부하가 걸릴수 있다. 그래서 buffer에 데이터를 한번에 모아서 연산을 한다.
반대로 값을 내보낼때도 buffer에 저장해 모았다가 한번에 내보낸다.
stream
stdin : 입력
stdout : 출력
stderr : 에러
파일 열기, 닫기
FILE* 구조체 포인터
- 파일에 접근할 때 사용하는 구조체 포인터
fopen_s(&파일 구조체 포인터, 파일경로이름, 모드)
- 파일을 열어주는 함수 ( fopen_s() : fopen()의 보안적인(security) 문제로 대체된 함수 )
fclose(파일 구조체 포인터)
- 파일을 닫아주는 함수
#include <stdio.h>
int main(void) {
// 파일 구조체 포인터
FILE* myFile;
int fileCon; // file Condition => 제대로 닫혔나 안닫혔나
// C:\programing 폴더에 test.txt이름으로 저장, w : 쓰기 r : 읽기
fopen_s(&myFile, "C:\\programing\\test.txt", "w");
// 파일이 열렸는지 확인
if (myFile != NULL) {
printf("파일이 성공적으로 열림\n");
}
else {
printf("파일이 제대로 열리지 않음\n");
}
// 파일이 제대로 닫혔는지 확인
// 파일을 사용하고 나서 닫아주는 것이 좋다. (컴퓨터 자원 반납)
fileCon = fclose(myFile);
if (fileCon != EOF) {
printf("파일이 성공적으로 닫힘\n");
}
else {
printf("파일이 제대로 닫히지 않음\n");
}
return 0;
}
파일이 만들어 지는지 확인해보자
프로그램을 돌려보자
성공적으로 프로그램이 돌아가고 난뒤,
자신이 경로를 설정한곳으로 가서 파일이 생겼는지 확인해 보자
이처런 C드라이브에 programing 폴더안에 test.txt라는 메모장 파일이 만들어 진것을 알 수 있다.
파일 모드
파일을 다룰때는 모드라는 값에 따라 읽거나 쓰거나 추가를 하거나 한다.
r : 읽기
w : 쓰기
a : 추가하기
파일을 입출력을 할때 텍스트모드로 할지 바이너리(2진수) 모드로 설정할지 정할 수 있다.
t : 텍스트
b : 바이너리
위 모드의 종류를 동시에 사용할 수 있다.
예를들어,
wt : 파일을 쓰기 전용으로 열고, 텍스트 모드로 입출력한다.
rb : 파일을 읽기 전용으로 열고, 바이너리 모드로 입출력한다.
fgets()와 fputs() 함수
파일에 입출력을 할때 사용하는 함수가 있다.
fgetc(스트림 종류) : 문자 입력
fputc(데이터, 스트림) : 문자 출력
그럼 메모장에 글을 써보도록 하자
#include <stdio.h>
int main(void) {
// 파일 구조체 포인터
FILE* myFile;
int fileCon; // file Condition => 제대로 닫혔나 안닫혔나
// C:\programing 폴더에 test.txt이름으로 저장, w : 쓰기 r : 읽기
fopen_s(&myFile, "C:\\programing\\test.txt", "w");
// 파일이 열렸는지 확인
if (myFile != NULL) {
printf("파일이 성공적으로 열림\n");
}
else {
printf("파일이 제대로 열리지 않음\n");
}
///////// 파일 내용 //////////
int input = 0;
puts("input data");
while (input != EOF) {
input = fgetc(stdin); // stdin : Standard input : 키보드 입력
fputc(input, myFile); // 파일에 데이터 넣음
}
//////////////////////////////
return 0;
}
데이터를 넣어준뒤에 컨트롤+c 또는 컨트롤+z 를 눌러 프로그램을 종료시킨다.
그리고 내가 입력한 값이 제대로 메모장에 적혔는지 확인해보자
정상적으로 파일에 글이 써진것을 알 수 있다.
참고
이 방법말고도 fgets()와 fputs()를 이용한 방법도 있다. 이때는 buffer를 이용한다.
#include <stdio.h>
int main(void) {
// 파일 구조체 포인터
FILE* myFile;
int fileCon; // file Condition => 제대로 닫혔나 안닫혔나
// C:\programing 폴더에 test.txt이름으로 저장, w : 쓰기 r : 읽기
fopen_s(&myFile, "C:\\programing\\test.txt", "w");
// 파일이 열렸는지 확인
if (myFile != NULL) {
printf("파일이 성공적으로 열림\n");
}
else {
printf("파일이 제대로 열리지 않음\n");
}
///////// 파일 내용 //////////
int input = 0;
char bf[20];
puts("input data");
input = fgets(bf, sizeof(bf), stdin); // 키보드 입력
fputs(bf, myFile); // 파일에 데이터 넣음
//////////////////////////////
return 0;
}
'Language > C&C++' 카테고리의 다른 글
C++ :: std:: 접두어와 iostream 헤더파일 #2 (0) | 2018.02.18 |
---|---|
C++ :: C++이란? C언어의 객체지향 특징이 추가된 언어 #1 (0) | 2018.02.18 |
C언어 :: strchr(), strstr(), strupr(), strlwr() 함수 사용법 #21 (0) | 2018.02.09 |
C언어 :: strlen(), strcpy(), strncpy() 함수 사용법 #20 (0) | 2018.02.09 |
C언어 :: gets(), puts() 함수 사용법 #19 (0) | 2018.02.09 |
최근댓글