[C언어] 파일관련(1) fopen(), frpintf(), fclose(), fscanf()
C언어를 배우면 콘솔창에서만 입력받고 출력하고를 먼저 배운다.
이후에는 파일을 가져오고 읽고... 한다!
파일에 문자열을 쓸 때는 먼저 fopen()으로 파일 포인터를 얻은 뒤 fprintf()를 사용한다.
- 헤더파일 : stdio.h
- FILE *포인터이름 = fopen(파일명, 파일모드);
- FILE *fopen(char const *_FileName, char const *_Mode);
- 성공하면 파일 포인터를 반환, 실패하면 NULL을 반환
- fprintf(파일포인터, 서식, 값1, 값2, ...);
- int fprintf(FILE * const _Stream, char const * const _Format, ...);
- 성공하면 쓴 문자열의 길이를 반환, 실패하면 음수를 반환
- fclose(파일포인터);
- int fclose(FILE *_stream);
- 성공하면 0을 반환, 실패하면 EOF(-1)를 반환
- fscanf(파일포인터, 서식, 변수의주소1, 변수의주소2, …);
- int fscanf(FILE * const _Stream, char const * const _Format, ...);
- 성공하면 읽어온 값의 개수를 반환, 실패하면 EOF(-1)를 반환
- 예제(1)
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h> // fopen, fprintf, fclose 함수가 선언된 헤더 파일
int main()
{
FILE *fp = fopen("hello.txt", "w"); // hello.txt 파일을 쓰기 모드(w)로 열기.
// 파일 포인터를 반환
fprintf(fp, "%s %d\n", "Hello", 100); // 서식을 지정하여 문자열을 파일에 저장
fclose(fp); // 파일 포인터 닫기
return 0;
}
>> 컴파일을 하게되면, 이 코드(.c) 파일이 있던 폴더에 hello.txt 파일이 생성된다.
열어보면, "Hello 100"을 확인할 수 있다.
- 예제(2)
#define _CRT_SECURE_NO_WARNINGS // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h> // fopen, fscanf, fclose 함수가 선언된 헤더 파일
int main()
{
char s1[10];
int num1;
FILE *fp = fopen("hello.txt", "r"); // hello.txt 파일을 읽기 모드(r)로 열기.
// 파일 포인터를 반환
fscanf(fp, "%s %d", s1, &num1); // 서식을 지정하여 파일에서 문자열 읽기
printf("%s %d\n", s1, num1); // Hello 100: 파일에서 읽은 값을 출력
fclose(fp); // 파일 포인터 닫기
return 0;
}
>> hello.txt안에는 입력한 문자열이 들어있다.
ㅇfopen()
- 파일 열기에 성공하면 파일포인터 반환, 실패시 NULL 반환
- 두번째 인자에 파일모드가 들어감
- 파일모드는 보통 "rb", "rt", "w+b", "w+t"와 같이 읽기/쓰기 모드와 텍스트/바이너리 모드를 조합해서 사용한다.
(t와 b는 단독으로 사용할 수 없다)
- 파일 경로를 잘 지정해주어야 한다.
ㅇfclose()
- 파일 포인터도 구조체 FILE 크기만큼 동적 메모리를 할당한 것이기 때문에, fclose()로 닫아주지 않으면 메모리 누수가 발생함
ㅇfprintf()
- fprintf()로도 화면에 문자열을 출력 할 수 있다.(stdout 사용)
>> fprintf(stdout, "%s %d\n", "Hello", 100); // Hello 100: 서식을 지정하여 화면(stdout)에 문자열 출력
- 즉, fprintf(stdout, ....); 은 printf 함수와 동작이 같다.
ㅇfscanf()
- 파일 포인터를 넣는다는 점 말고는 scanf 함수와 사용법이 같음
- stdin 매크로를 활용하여 사용자가 입력한 값을 변수에 저장할 수 있음
char s1[10];
int num1;
fscanf(stdin, "%s %d", s1, &num1); // 서식을 지정하여 표준 입력(stdin)에서 문자열 읽기
- 즉, fscanf(stdin, ....); 은 scanf 함수와 동작이 같다.