[C] 파일 입출력 4 (fprintf, fscanf)
다른 파일에서 문자열과 정수형 자료를 읽어들이고 싶을 때
fprintf 함수
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
int main () {
FILE* fp;
fp = fopen("score.txt", "w");
if (fp == NULL) {
printf("file open fail\n");
exit(1);
}
// 표준 출력장치 : 모니터
// 모니터에 출력할 것을 파일 포인터에 바꾸는 역할.
fprintf(fp, "%s %d %d %d\n", "우키킴", 70, 60, 90);
fprintf(fp, "%s %d %d %d\n", "홍길동", 80, 80, 80);
fprintf(fp, "%s %d %d %d\n", "이순신", 100, 100, 100);
fclose(fp);
}
위의 예시코드 대로 작성을 하면 score.txt라는 새로운 파일이 생성되며, 그 안에 데이터가 저장되는 형태이다.
fscanf 함수
#include <stdio.h>
#include <stdlib.h>
#pragma warning (disable : 4996)
typedef struct score
{
char name[20];
int kor, eng, mat;
}score;
int main() {
int i = 0;
score s[3];
FILE* fp;
fp = fopen("score.txt", "r");
if (fp == NULL) {
printf("실패하였습니다.\n");
exit(-1);
}
// fp의 포인터로부터 읽어들인 자료를 각각 name, kor, eng, mat에 저장한다.
// fscanf는 파일의 끝을 EOF로 처리한다.
while (fscanf(fp, "%s %d %d %d", s[i].name, &s[i].kor, &s[i].eng, &s[i].mat) != EOF){
printf("%s %d %d %d\n", s[i].name, s[i].kor, s[i].eng, s[i].mat);
i++;
}
fclose(fp);
return 0;
위의 예시코드대로 작성한다면 출력결과는 아래와 같다.
//출력 결과
우키킴 70 60 90
홍길동 80 80 80
이순신 100 100 100
fscanf함수, fprintf함수의 연계
쉽게 생각하자. fprintf 함수는 가리키는 데이터를 읽어들여서 가리키는 포인터에다가 데이터를 저장, 출력하는 형태이고,
fscanf함수는 해당 데이터로부터 데이터를 출력하는 형태이다.
위에서 fprintf 함수를 통해서 score.txt 파일을 만들었고, fscanf함수를 통해서 만들어놓았던 score.txt 파일에서 데이터를 읽어서 출력하고 있다.
파일을 가리키는 포인터가 stdin(표준입력장치, 키보드 등) 그리고 stdout(표준출력장치, 모니터 등)을 가리키게 된다면
그것이 바로 scanf함수와 printf함수가 될 수 있다.