728x90
파일 입출력 예제 - 파일을 읽어서 파일 내용을 구조체에 저장하고, 검색하기 |
이번 포스트에서는 파일입출력을 연습해보겠습니다. 사람들의 이름과 나이가 담긴 텍스트 파일을 읽어서, 구조체배열에 저장하고 사람의 이름을 검색해서 파일의 어디에 위치해있는지를 출력합니다.
문제 풀이 전 사전 작업 |
1. 파일 입출력 개념을 공부했다는 가정하에 작성되는 글입니다. 먼저 현재 작성중인 소스파일의 폴더에 읽을 텍스트파일을 함께 위치해줍니다.
2. 텍스트파일에 내용을 작성해줍니다. 저는 다음과 같이 6명의 이름과 나이를 작성해두었습니다.
문제 풀이 |
먼저 파일을 열고, 파일 내용을 읽어야하는데 텍스트파일에 내용이 저장된 형식에 맞게 읽어와야합니다. 현재 저장된 형식을 살펴보면, 한 줄에 한명의 정보가 저장되어있고 각 사람의 정보는 이름과 나이가 공백 한 칸으로 띄어져있습니다.
따라서 이 형식에 맞게 파일의 내용을 읽어와야합니다.
풀이 알고리즘
먼저 구조체배열을 충분히 큰 크기로 선언하고, (필요에 따라 동적으로 할당할 수 있습니다.) 파일의 내용을 한 줄씩 읽습니다. buffer 문자열에 파일의 한 line을 저장하고 그 뒤에는 문자열을 strtok함수를 이용해서 분리하여 구조체에 저장합니다. 이 개념은 지난 포스트인 문자열 분리 실습 을 참고하시면 됩니다.
man-25-1.tistory.com/57?category=940891
그 후에 구조체에 있는 내용을 훑으면서, 찾고자하는 이름을 검색해서 정보를 출력하는 과정입니다. 문법적인것 외에는 아주 간단한 문제입니다.
풀이 코드
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
'지난 학기들의 기록 > C 기초' 카테고리의 다른 글
[C실습] 동적할당 유형 분석 1 - 구조체멤버에 동적할당을 이용하여 저장하기(strncpy 활용예제) (0) | 2020.11.20 |
---|---|
[C실습] 문자열 유형 분석 2 - 포인터배열을 사용한 strtok구현하기(문자열에서 단어 분리하기) (0) | 2020.10.06 |
[C실습] 문자열 유형 분석 1 - 문자열에서 숫자 분리하기 (0) | 2020.10.05 |
[C실습] 포인터 유형 분석 1 - 조건부 정렬 (0) | 2020.09.18 |
[C실습] 파일 입출력 예제 - 특정 문자열 검색하기 (2) | 2020.08.27 |
댓글