C에서 사용자 입력을 받아 파일에 저장하는 방법 - scanf, fopen, fprintf 사용법
C에서 사용자 입력을 받아 파일에 저장하는 방법
C에서 사용자 입력을 받아 파일에 저장하는 방법을 배우기 전에, 먼저 입력을 받는 함수들이 어떻게 작동하는지 살펴보자. get_int나 get_string 같은 함수는 내부적으로 scanf를 활용하는데, 이를 직접 구현해보면서 메모리 구조와 파일 출력 방법을 익혀보자(:
핵심 개념
- scanf
- fopen
- fprintf
- fclose
메모리 구조 복습
그전에, C 프로그램의 메모리 구조를 다시 한번 정리해봐야지ㅎㅎ!
- 코드 영역: 실행될 프로그램의 바이너리 코드가 저장되는 공간
- 데이터 영역 (글로벌 영역): 전역 변수 등이 저장되는 공간
- 힙 (Heap): malloc 등으로 동적으로 할당된 메모리가 저장되는 공간 (아래로 확장됨)
- 스택 (Stack): 함수 호출 시 로컬 변수 등이 저장되는 공간 (위로 확장됨)
스택과 힙은 서로 반대 방향으로 확장되기 때문에, 메모리가 한정된 환경에서는 스택 오버플로우(Stack Overflow) 또는 힙 오버플로우(Heap Overflow)가 발생할 수 있다.
사용자 입력 받기
C에서 사용자 입력을 받을 때 사용하는 scanf를 직접 구현해보자.
get_int 구현
#include <stdio.h>
int main(void)
{
int x;
printf("x: ");
scanf("%i", &x);
printf("x: %i\n", x);
}
여기서 &x를 사용한 이유는 scanf가 입력받은 값을 해당 변수의 메모리 주소에 저장하기 때문이다. x는 단순한 변수이므로, 주소를 직접 넘겨줘야 한다.
get_string 구현
#include <stdio.h>
int main(void)
{
char s[5];
printf("s: ");
scanf("%s", s);
printf("s: %s\n", s);
}
여기서 scanf("%s", s);에서 &s가 아닌 s를 넘긴 이유는 s가 배열이기 때문이다.
s가 배열이라서 &s를 안 붙여도 되는 이유
C에서 배열의 이름은 배열의 첫 번째 요소의 주소를 의미한다. 즉, s 자체가 주소를 나타내기 때문에 &s를 붙일 필요가 없다.
일반 변수와 비교해보자.
int x;
scanf("%i", &x); // 정수형 변수는 주소(&x)를 넘겨줘야 함
char s[10];
scanf("%s", s); // 문자열은 s가 이미 주소를 의미하므로 & 필요 없음
따라서 char s[5];에서 s는 배열의 첫 번째 요소의 주소를 나타낸다. 따라서 scanf("%s", s);에서 s를 직접 넘겨도 된다.
파일 쓰기
이제 사용자 입력을 받아 파일에 저장하는 프로그램을 만들어보자(:
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *file = fopen("phonebook.csv", "a");
char name[50];
char number[20];
printf("Name: ");
scanf("%s", name);
printf("Number: ");
scanf("%s", number);
fprintf(file, "%s,%s\n", name, number);
fclose(file);
}
fopen("파일이름", "모드")에서 모드에 ""를 붙이는 이유
fopen 함수의 원형을 보면 다음과 같다.
FILE *fopen(const char *filename, const char *mode);
filename과 mode는 문자열을 인자로 받도록 설계되어 있음. 따라서 "a"처럼 쌍따옴표를 붙여 문자열을 전달해야 한다.
fprintf(file, "%s,%s\n", name, number);에서 왜 ""를 안 붙일까?
여기서 name, number는 변수이고, "%s" 형식 지정자를 통해 문자열로 출력되도록 설정했기 때문이다. 즉, name과 number는 **문자열을 가리키는 포인터(주소)**이고, "a" 같은 것은 직접 문자열을 입력하는 리터럴이기 때문에 차이가 있다!
파일 작업 순서
C에서 파일을 다룰 때는 fopen 함수로 파일을 열고, fprintf로 내용을 쓰고, 작업이 끝난 후에는 fclose로 파일을 닫는다.
fopen 함수
fopen 함수는 파일을 열 때 사용된다. 이 함수는 파일을 열고, 파일 포인터를 반환한다. 이를 통해 파일에 대한 작업을 할 수 있다.
FILE *fopen(const char *filename, const char *mode);
- filename: 열고자 하는 파일의 이름
- mode: 파일을 열 때의 모드. 예를 들어, "r"은 읽기, "w"는 쓰기, "a"는 덧붙이기(append)를 의미한다.
fprintf 함수
fprintf는 파일에 데이터를 출력하는 함수다. printf와 비슷하지만, 표준 출력이 아니라 파일에 데이터를 쓴다는 점에서 차이가 있다.
int fprintf(FILE *stream, const char *format, ...);
- stream: 데이터를 출력할 파일 포인터
- format: 출력 형식을 지정하는 문자열
- 나머지 인자들은 출력할 값들이다.
fclose 함수
파일 작업을 모두 마친 후에는 fclose 함수를 사용하여 파일을 닫아야 한다. 파일을 닫지 않으면 파일 내용이 완전히 저장되지 않거나 다른 문제를 일으킬 수 있다.
int fclose(FILE *stream);
사용자 입력 받기 + 파일에 저장하기
앞에서 설명한 대로, 사용자 입력을 받아 파일에 저장하는 프로그램을 만들어보자.
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *file = fopen("phonebook.csv", "a"); // 파일 열기 (덧붙이기 모드)
char name[50];
char number[20];
printf("Name: ");
scanf("%s", name); // 사용자로부터 이름 입력 받기
printf("Number: ");
scanf("%s", number); // 사용자로부터 전화번호 입력 받기
fprintf(file, "%s,%s\n", name, number); // 파일에 이름과 번호 저장
fclose(file); // 파일 닫기
}
fopen 함수에서 모드에 대해 더 알아보기
fopen("파일이름", "모드")에서 모드에 대한 의미를 정확히 이해하는 것이 중요하다. fopen에서 사용되는 모드는 다음과 같다.
- "r": 파일을 읽기 전용으로 연다. 파일이 존재해야 한다.
- "w": 파일을 쓰기 전용으로 연다. 파일이 존재하면 덮어쓰며, 파일이 없다면 새로 만든다.
- "a": 파일을 덧붙이기 모드로 연다. 파일이 없다면 새로 만든다.
따라서 "a" 모드는 기존 파일에 데이터를 덧붙이는 용도로 사용된다.
- fopen을 사용해 파일을 열고, fprintf로 데이터를 파일에 저장하며, 작업이 끝난 후 fclose로 파일을 닫는다.
- scanf로 사용자 입력을 받는 방식도 중요하다. 배열이나 포인터의 경우 주소를 넘겨야 하는데, 배열의 이름은 첫 번째 요소의 주소를 나타내므로 &를 붙이지 않아도 된다.
- 파일을 다룰 때 모드를 정확히 이해하고 사용해야 한다. r, w, a 등 각 모드는 파일을 열고 처리하는 방식에 차이를 준다(:
'IT' 카테고리의 다른 글
인스타그램 바이럴 마케팅 하는 방법 (2025) (0) | 2025.04.03 |
---|---|
스택과 힙의 차이점 이해하기: 포인터를 이용한 메모리 교환 방법 (0) | 2025.03.30 |
C 언어 동적 메모리 할당 쉽게 이해하기 | malloc, free, valgrind 활용 (0) | 2025.03.30 |
C 언어에서 문자열 복사하는 방법: malloc과 for문을 활용한 정확한 복사 (0) | 2025.03.30 |
C 언어에서 string이 없는 이유 – 문자열과 포인터의 관계 (0) | 2025.03.30 |
댓글
이 글 공유하기
다른 글
-
인스타그램 바이럴 마케팅 하는 방법 (2025)
인스타그램 바이럴 마케팅 하는 방법 (2025)
2025.04.03 -
스택과 힙의 차이점 이해하기: 포인터를 이용한 메모리 교환 방법
스택과 힙의 차이점 이해하기: 포인터를 이용한 메모리 교환 방법
2025.03.30 -
C 언어 동적 메모리 할당 쉽게 이해하기 | malloc, free, valgrind 활용
C 언어 동적 메모리 할당 쉽게 이해하기 | malloc, free, valgrind 활용
2025.03.30 -
C 언어에서 문자열 복사하는 방법: malloc과 for문을 활용한 정확한 복사
C 언어에서 문자열 복사하는 방법: malloc과 for문을 활용한 정확한 복사
2025.03.30