C

파일 입출력

에드장 2021. 2. 13. 23:20

파일 입출력의 필요성

프로그램이 꺼진 이후에도 데이터를 저장하기 위해서는 파일 입출력이 필요합니다

 

파일 입출력 변수는 FILE 형식의 포인터 변수로 선언합니다

파일을 열때는 fopen() 함수를 이용하고 닫을때는 fclose() 함수를 이용합니다

 

fopen() 함수에는 파일 경로와 접근 방식을 설정할 수 있습니다

기본 경로는 현재 프로그램의 경로입니다

접근 방식

  • r   파일에 접근하여 데이터를 읽습니다
  • w   파일에 접근하여 데이터를 기록합니다(파일이 이미 존재하면 덮어쓰기)
  • a   파일에 접근하여 데이터를 뒤에서부터 기록합니다

파일 입출력을 위해서 fprintf()fsanf() 가 사용됩니다

fprintf(파일 포인터 , 서식 , 형식지정자);

fscanf(파일 포인터, 서식 , 형식지정자);

 

파일을 처리 한 이후에 닫아주지 않으면 메모리 누수가 발생하기 때문에

열고 , 읽고/쓰고, 닫기의 과정을 철저히 따라야 합니다

 

텍스트 파일 읽는 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
int main(void) {
 
    FILE* fp = NULL;
    int c;
 
    fp = fopen("input.txt""r");
 
    if (fp == NULL) {
        printf("파일 열기에 실패했습니다\n");
    }
    else {
        printf("파일 열기에 성공했습니다\n");
    }
    while ((c = fgetc(fp)) != EOF) {
        putchar(c);
    }
    fclose(fp);
    return 0;
}
cs

 

텍스트 파일 분석 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define _CRT_SECURE_NO_WARNINGS
 
#include <stdio.h>
#include <string.h>
 
int main(void) {
    FILE* fp;
    char fname[256];
    char buffer[256];
    char word[256];
    int line = 0;
 
    printf("파일 이름을 입력하세요 : ");
    scanf("%s", fname);
 
    printf("탐색할 단어를 입려하세요 : ");
    scanf("%s", word);
 
    if ((fp = fopen(fname, "r")) == NULL) {
        fprintf(stderr, "파일 %s을 열수 없습니다\n", fname);
        return 0;
    }
    while (fgets(buffer, 256, fp)) {
        line++;
        if (strstr(buffer, word)) {
            printf("라인 %d : 단어 %s이(가) 발견되었습니다\n", line, word);
        }
    }
    fclose(fp);
 
    return 0;
}
cs

 

 

 

 

파일 입출력을 활용해 간단한 학생 정보 시스템 만들기 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
typedef struct {
    char name[20];
    int score;
} student;
 
int main(void) {
    int n, sum = 0;
    FILE* fp;
    fp = fopen("input.txt""r");
    fscanf(fp, "%d"&n);
    student *students = (student*)malloc(sizeof(student) * n);
    if (students == NULLreturn -1;
        for (int i = 0; i < n; i++) {
            fscanf(fp, "%s %d"&((students + i)->name), &((students + i)->score));
            printf("이름: %s , 성적: %d\n", (students + i)->name, (students + i)->score);
        }
    system("pause");
    return 0;
}
 
cs

위의 코드를 작성하기전에 먼저 프로젝트가 저장되어있는 Debug 폴더에 input.txt 파일을 만들고

학생수

이름 점수  를 작성해야합니다

ex)

5
장병학 90
김찬호 91
유민호 92
박민규 93
홍준휘 94

 

파일 입출력을 활용해 간단한 학생 정보 시스템 만들기 예시2 (성적 평균 구하고 메모리 할당 해제하기)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
 
typedef struct {
    char name[20];
    int score;
} student;
 
int main(void) {
    int n, sum = 0;
    FILE* fp;
    fp = fopen("input.txt""r");
    fscanf(fp, "%d"&n);
    student *students = (student*)malloc(sizeof(student) * n);
    if (students == NULLreturn -1;
        for (int i = 0; i < n; i++) {
            fscanf(fp, "%s %d"&((students + i)->name), &((students + i)->score));
        }
        for (int i = 0; i < n; i++) {
            sum += (students + i)->score;
        }
    free(students);
    fclose(fp);
    printf("점수 평균: %.2f\n", (double)sum / n);
    system("pause");
    return 0;
}
 
cs

 

위와 같이 파일 입출력이 끝난 이후에는 반드시 객체를 메모리에서 할당 해제해주어야 합니다