I am Incheol Shin(여러분 이름) 이 저장된 test.txt 파일에서 이름부분만 남기는 프로그램을 작성하여 제출(Makefile 포함)하시오.
네 번째 과제는 fgets
를 사용해서 문자열을 처리하는 것이다.
내 이름 "I am Dohyun Kim"이 저장된 test.txt 파일을 buffer에 저장하고, buffer에서 "Dohyun Kim"을 찾아서 해당 위치 포인터를 반환하면 된다.
char *fgets(char *str, int n, FILE *stream);
파일로부터 문자열을 읽어오는 함수이며, 원형은 위와 같다.
str
: 읽어온 문자열을 저장할 버퍼n
: 읽어올 최대 문자 수 (버퍼 크기)stream
: 데이터를 읽어올 파일 포인터
사진과 같이 "I am Dohyun Kim" 을 작성하고 저장한다.
fopen()
으로 파일을 읽기 모드로 열고 fgets()
로 파일을 읽은 후 버퍼에 저장한다. 버퍼의 사이즈를 100으로 설정했으므로 최대 100자까지 읽을 수 있다. FILE *file;
char buffer[100];
char *name;
file = fopen("test.txt", "r");
if (file == NULL) {
printf("cannot open this file.\n");
return 1;
}
fgets(buffer, 100, file);
fclose(file);
name
에 저장한다. 만약 "Dohyun Kim"이 발견되지 않으면 NULL을 반환한다.name = strstr(buffer, "Dohyun Kim");
name
이 NULL이 아닐 때, 즉 "Dohyun Kim"을 찾은 경우에 printf("%s", name);
이 실행되어 이름의 시작부터 끝까지 출력한다. 찾지 못한 경우에는 else문이 출력된다.if (name != NULL)
printf("%s", name);
else
printf("cannot find name.\n");
최종 코드
#include <stdio.h>
#include <string.h>
int main() {
FILE *file;
char buffer[100];
char *name;
file = fopen("test.txt", "r");
if (file == NULL) {
printf("cannot open this file.\n");
return 1;
}
fgets(buffer, 100, file);
fclose(file);
name = strstr(buffer, "Dohyun Kim");
if (name != NULL)
printf("%s", name);
else
printf("cannot find name.\n");
return 0;
}
위 코드를 컴파일할 makefile을 작성한다.
CC = gcc
CFLAGS = -Wall
SRC = name.c
TARGET = name
$(TARGET): $(SRC)
$(CC) $(CFLAGS) -o $(TARGET) $(SRC)
clean:
rm -f $(TARGET)
make -f name_mk
chmod +x name
./name
위 코드로 makefile 빌드 후 생성된 실행 파일에 실행 권한을 주고 실행한다.
잘 나온다.
끝.