fscanf 함수

int  fscanf (FILE * fp ,const char *format,…); 파일 스트림에 포멧을 지정하여 읽는 함수

입력 매개 변수 리스트

fp 입력 파일 스트림

format 포멧 문자열

… 가변 인자 리스트

반환 값

성공 시 변환 성공 개수, 오류 시 EOF

fscanf 함수도 scanf 함수처럼 문자열을 읽어올 때 버퍼 크기를 전달하지 않아 버퍼 오버플로우 문제가 발생할 수 있습니다. C11에서는 이를 개선한 fscanf_s를 제공합니다.

사용 예

//C언어 표준 라이브러리 함수 가이드
//int  fscanf (FILE * fp ,const char *format,...); 파일 스트림에 포멧을 지정하여 읽는 함수
//회원 정보를 파일에 쓴 후에 다시 읽어와서 출력
#pragma warning(disable:4996)
#include <stdio.h>

#define MAX_MEMBERS     10
#define MAX_NAME_LEN    20

//회원 구조체 정의
typedef struct {
    char name[MAX_NAME_LEN + 1];
    int age;
}Member;

int main(void)
{
    FILE * fp;
    int i;
    //원본 회원 배열
    Member members[MAX_MEMBERS] =
    {
        { "홍길동",20 },{ "강감찬",15 },{ "을지문덕",22 },{ "이순신",19 },{ "김구",30 },
        { "안중근",30 },{ "박찬호",35 },{ "김연아",17 },{ "아이유",20 },{ "주니엘",20 }
    };

    //읽어올 회원 배열
    Member members2[MAX_MEMBERS];

    //쓰기 모드로 파일 열기
    fopen_s(&fp, "data.txt", "w");
    if (fp == NULL)
    {
        perror("error fopen");
        return;
    }

    //전체 회원 정보를 파일에 쓰기
    for (i = 0; i<MAX_MEMBERS; i++)
    {
        fprintf(fp, "%-10s %-10d\n", members[i].name, members[i].age);
    }
    fclose(fp);//파일 스트림닫기

               //읽기 모드로 파일 열기
    fopen_s(&fp, "data.txt", "r");
    if (fp == NULL)
    {
        perror("error fopen");
        return;
    }

    //장식을 위한 출력
    printf("%-10s %-10s\n", "이름", "나이");
    //입력 파일 스트림에서 포멧에 맞게 회원 정보 읽어온 후에 출력 반복
    for (i = 0; i<MAX_MEMBERS; i++)
    {
        fscanf(fp, "%s %d\n", members2[i].name, &members2[i].age);
        printf("%-10s %-10d\n", members2[i].name, members2[i].age);
    }
    fclose(fp);//파일 스트림 닫기
    return 0;
}

출력

이름      나이
홍길동    20
강감찬    15
을지문덕  22
이순신    19
김구      30
안중근    30
박찬호    35
김연아    17
아이유    20
주니엘    20

새로 만들어진 data.txt 내용

홍길동    20
강감찬    15
을지문덕  22
이순신    19
김구      30
안중근    30
박찬호    35
김연아    17
아이유    20
주니엘    20