본문 바로가기
지난 학기들의 기록/C 기초

[C실습] 파일 입출력 - 파일을 읽어서 구조체에 저장하고 검색하기

by 아메리카노와떡볶이 2020. 12. 15.
728x90
파일 입출력 예제 - 파일을 읽어서 파일 내용을 구조체에 저장하고, 검색하기

 

이번 포스트에서는 파일입출력을 연습해보겠습니다. 사람들의 이름과 나이가 담긴 텍스트 파일을 읽어서, 구조체배열에 저장하고 사람의 이름을 검색해서 파일의 어디에 위치해있는지를 출력합니다.

 

문제 풀이 전 사전 작업

1. 파일 입출력 개념을 공부했다는 가정하에 작성되는 글입니다. 먼저 현재 작성중인 소스파일의 폴더에 읽을 텍스트파일을 함께 위치해줍니다.

 

2. 텍스트파일에 내용을 작성해줍니다. 저는 다음과 같이 6명의 이름과 나이를 작성해두었습니다.

 

문제 풀이

 

먼저 파일을 열고, 파일 내용을 읽어야하는데 텍스트파일에 내용이 저장된 형식에 맞게  읽어와야합니다. 현재 저장된 형식을 살펴보면, 한 줄에 한명의 정보가 저장되어있고 각 사람의 정보는 이름과 나이가 공백 한 칸으로 띄어져있습니다.

따라서 이 형식에 맞게 파일의 내용을 읽어와야합니다.

 

 

풀이 알고리즘

먼저 구조체배열을 충분히 큰 크기로 선언하고, (필요에 따라 동적으로 할당할 수 있습니다.) 파일의 내용을 한 줄씩 읽습니다. buffer 문자열에 파일의 한 line을 저장하고 그 뒤에는 문자열을 strtok함수를 이용해서 분리하여 구조체에 저장합니다. 이 개념은 지난 포스트인 문자열 분리 실습 을 참고하시면 됩니다.

 

man-25-1.tistory.com/57?category=940891

 

[C실습] 문자열 유형 분석 2 - 포인터배열을 사용한 strtok구현하기(문자열에서 단어 분리하기)

포인터배열을 사용한 strtok함수 구현하기 문자열 string.h 헤더파일에 내장되어있는 strtok함수는 string token 즉 문자열을 단어로 쪼개주는 함수입니다. 이번 포스트에서는 strtok함수를 C언어로 구현

man-25-1.tistory.com

그 후에 구조체에 있는 내용을 훑으면서, 찾고자하는 이름을 검색해서 정보를 출력하는 과정입니다. 문법적인것 외에는 아주 간단한 문제입니다.

 

 

풀이 코드

 

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define file_name "peopleinfo.txt"
typedef struct people_information {
    char name[21];
    int age;   
} people_info;
 
void find_people_name(people_info* people, int size);
int main(void)
{
    people_info people[100];
    FILE* fp = fopen(file_name, "r");// 파일 읽기모드로 열기
    if (fp == NULL) {
        printf("fail to read file");
        return 0;
    }
    char buffer[1001],*token; 
 
    int i = 0;
    int idx = 0;
    while (!feof(fp)) {
        i = 0;//i초기화
        fgets(buffer, 1001, fp); 
        token = strtok(buffer, " "); //
        while (token != NULL) {
 
            if (i == 0) {
                strcpy(people[idx].name, token);
            }
            else if (i == 1) {
                people[idx].age = atoi(token);
            }
            i++;
            token = strtok(NULL" ");
        }
        idx++;
    }
    //읽은 내용이 잘 저장됐는지 출력
    for (int i = 0; i < idx; i++) {
        printf("%s %d\n", people[i].name, people[i].age);
    }
    fclose(fp); // 파일 닫기
 
    find_people_name(people,idx);
    return 0;
}
 
void find_people_name(people_info* people, int size)
{
    printf("찾고싶은 사람의 이름을 입력하세요: ");
    char find_name[100];
    scanf("%s", find_name);
    char* ptr;
    people_info * p;
    int line=0;
    for (p = people; p < people + size; p++,line++) {
        ptr = strstr(p->name, find_name);
        if (ptr != NULL) {
            printf("파일의 [%d]line에 이름 :[%s], 나이:[%d] 발견\n",line, p->name, p->age);
        }
    }
}
 
 
cs

 

 

출력 결과

 

출력 결과

 

감사합니다.

728x90

댓글