<목차>
1. 파일 개방
- 표준 입출력 스트림 파일
- fopen
- fgetc함수(하나의 문자를 가지고 오는 함수)
- 위치 지시자
- EOF (-1)
- fputs 함수(하나의 문자를 출력하는 함수)
2. 텍스트 파일과 바이너리 파일
3. +개방 모드, fseek, rewind, feof 함수
fopen함수를 통해서 파일을 개방하고 난 다음
실제로 입출력을 할 때는 입출력 함수를 사용한다.
입출력 함수엔 다양한 함수가 있다.
가장 기본적으로 사용할 수 있는 건 하나의 문자열을
입력하거나 출력하는 함수가 되는 것이다.
실제로 데이터를 파일로부터 입력을 시켜서
출력하는 프로그램을 만들려고 한다.
FILE* fp; // 파일 포인터 선언
fp = fopen("a.txt", "r"); // fopen함수를 통해서 a.txt란 파일을 read 모드로 해서 개방해라(찾아라)
if(fp == NULL) // 개방이 잘 됐는지 체크하는 것, Null이면 파일이 없는 것
{
printf("file not found"); //파일이 없으면 없다고 알려주고
exit(1); // 실행종료하기
}
fgetc함수와 fputc 함수
하나의 문자를 입력할 때 사용하는 함수가 fgetc다.
fgetc는 어떠한 파일로부터 문자를 가지고 올 것인지
파일 포인터를 줘야 할 것이다.
fgetc(fp) // fp를 인수로 주면 fgetc는 파일 포인터를 가지고
a.txt파일의 실제 데이터로 간다. 거기서 실제 데이터를 가져다가
반환을 해준다.
반환한 값을 문자에 받아주기 위해서
ch = fgetc(fp)로 만들어주고
ch를 받아주기 위한 char ch; 즉 character형 변수 ch를 선언해주면 된다.
코드를 짜면 아래와 같다.
char ch;
FILE* fp; // 파일 포인터 선언
fp = fopen("a.txt", "r"); // fopen함수를 통해서 a.txt란 파일을 read 모드로 해서 개방해라(찾아라)
if(fp == NULL) // 개방이 잘 됐는지 체크하는 것, Null이면 파일이 없는 것
{
printf("file not found"); //파일이 없으면 없다고 알려주고
exit(1); // 실행종료하기
}
ch = fgetc(fp);
printf("%c", ch); //fp에 있는 a.txt로 가서 문자 한 개를 가져와서 ch저장하고
// printf를 통해 문자 한 개를 출력하고 끝나는 함수다.
fclose(fp); // file에 있는 데이터 다 썼으면 fclose로 닫아주면 된다.
return 0;
}
1) 위치 지시자
ch = fgetc(fp);
printf("%c", ch);
를 두 번 쓴 경우 a가 출력되는 게 아닌 p가 출력된다.
FILE 구조체에는 위치 지시자라고 해서
배열 인덱스가 있다. fgetc가 문자를 읽을 때 마다
0에서 1로 1에서 2로 이렇게 증가해서 a 다음에 p를 출력할 수 있는 것이다.
2) EOF <<(-1과 같다)
ch = fgetc(fp);
printf("%c", ch);
를 6번 째 썼다면 apple는 다섯 글자이고
여섯 번째에는 아무것도 없어서
쓰레기 값을 출력할 수 있는데
FILE 구조체에는 apple이의 크기 정보도 있기 때문에
자동적으로 여섯 번째 부터는 파일의 데이터를 다 읽었다고 인지하고
더 이상 출력할 수 있는 데이터가 없다는 표시로
EOF(End Of File)가 출력된다.
자 그러면 한 문자만 출력되는 게 아닌
파일에 있는 모든 문자를 출력하고 싶다면
fgetc가 반환하는 값이 EOF가 아닐 때 까지 출력하라.
라고 만들어주면 된다.
코드를 만들면 아래와 같다.
ch = fgetc(fp);
while(ch != -1); //eof가 아니라면
{
printf("%c", ch); //문자를 찍어라
ch = fgetc(fp); // 다음 문자를 읽어주고, 다시 while문 위로 올라간다.
}
파일로 데이터 출력 방법
a.txt안에 있는 파일을 읽어서
화면에 출력하는 게 아니라
디스크 파일에 다시 기록하는 것,
이건 복사 프로그램이 된다.
즉 하드디스크 안에 있는 a.txt란 파일을 읽어서
다시 하드디스크로 출력하는 거다.
파일로 데이터를 출력하려면 파일 한 개를 더 개방해줘야 한다.
char ch;
FILE* fp; *ofp; // 파일 한 개를 더 개방하는 거니까 ofp 추가 선언. 출력용으로 선언함
fp = fopen("a.txt", "r"); // fopen함수를 통해서 a.txt란 파일을 read 모드로 해서 개방해라(찾아라)
if(fp == NULL) // 개방이 잘 됐는지 체크하는 것, Null이면 파일이 없는 것
{
printf("file not found"); //파일이 없으면 없다고 알려주고
exit(1); // 실행종료하기
}
ofp = fopen("b.txt", "w"); //a.txt에서 읽어와서 read모드로 오픈했잖아?
// b.txt로 다시 write 모드로 오픈할 거다.
// b.txt가 현재 디렉터리에 없으면 null을 반환하는 게 아니라
// 빈 파일을 한 개 생성 시켜서 open을 해준다.
ch = fgetc(fp);
while(ch != -1)
{
fputc(ch, ofp); //출력할 문자 ch를 준다. ofp 파일과 연결되어 있는 게 b.txt다.
// 거기에 hdd 생성되어 있을 것이고
ch = fgetc(fp); // fp는 a.txt로부터 입력받은 문자를 출력하라
} // a.txt에 있는 파일의 내용을 b.txt로 복사하는 것이다.
fclose(ofp);
2. 텍스트 모드와 바이너리 모드
fp = fopen("a.txt", "r"); 를 보면
r만 써져 있는데 r만 쓰면 안된다.
이건 용도에 대한 모드고
파일의 형태를 나타내는 모드도 같이 써줘야 한다.
a.txt는 txt 파일 형태이기 때문에
fp = fopen("a.txt", "rt");
이렇게 작성해줘야 한다.
'BOX-IT > C++' 카테고리의 다른 글
[C++] 파일 개방과 입출력 (0) | 2022.05.16 |
---|---|
[C++] strcpy는 뭐고, 왜 쓰는 걸까? (1) | 2022.04.16 |
[C++] ‘strcpy’ was not declared in this scope 해결방법 (0) | 2022.04.11 |
C언어에서 '100< X <200' 은 잘못된 표현이다. (0) | 2022.04.10 |
[C++] #include <stdio.h>는 뭐고, 왜 쓰는 걸까? (8) | 2022.04.04 |