C언어 파일 입출력
C언어 표준 입출력 스트림

C언어의 파일 입출력 함수 (Fopen/Fclose)

- fopen ( file open) : 파일을 여는 함수
즉, FILE 포인터를 반환하여 해당 파일에 대한 정보를 돌려줍니다.
FILE은 stdio.h 에 선언되어있는 구조체입니다.
해당 구조체에는 파일에 대한 열기, 읽기, 쓰기, 닫기에 관련된 모든 상태 정보가 들어 있습니다.
*** fopen 함수가 파일을 찾아 개방하면 파일 포인터를 반환합니다.
fopen 함수는 실제 파일이 있는 장치와 연결되는 스트림 파일을 메모리에 만듭니다. 그리고 스트림 파일에 접근할 수 있도록 파일 포인터를 반화나합니다. 이포인터를 가지면 입출력 함수를 통해 원하는 입출력 작업을 수행할 수 있다.
[형식]
FILE *fopen(const char *, const char *);
ex.) FILE *fp = fopen("a.txt","r");
+ 실행파일이 있는 곳이 아닌 경로를 적을 때 : fopen("c:\\source\\a.txt", "r");
** \\역슬래쉬로 디렉터리를 나타내는 기호를 사용한다.
=> 매개변수 1번째에는 파일의 이름 , 경로를 지정한 이름이 들어갈 수 있습니다.
=> 매개변수 2번째에는 mode에 맞게 처리를 할 수 있도록 합니다.
[Mode 종류]

*** "r" : 파일이 없을 때 NULL반환
- fclose ( file close) : 파일을 닫는 함수
[형식]
int fclose(FILE *stream);
=> 정상적으로 파일을 닫는 경우 0을 반환하고, 실패한 경우 -1을 반환합니다.
ex.) FILE *fp = fopen("a.txt","r");
fclose(fp);
FILE 구조체

파일 입출력 (fopen / fclose) 예제

#include<stdio.h>
int main()
{
FILE *fp;
fp = fopen("test.txt", "w");
if(fp == NULL){
printf("파일열기 실패\n");
} else {
printf("파일열기 성공\n");
}
fclose(fp);
return 0;
}
=> "w" 모드 : 파일이 없다면 새로 생성된다.


파일 문자 단위 입력 fputc()
#include<stdio.h>
int main()
{
FILE *fp;
fp = fopen("test.txt", "w");
if(fp == NULL){
printf("파일열기 실패\n");
} else {
printf("파일열기 성공\n");
}
fputc('a', fp);
fputc('b', fp);
fputc('x', fp);
fclose(fp);
return 0;
}


=> fopen()파일을 열어 fputc() 함수를 이용하여 한 문자를 파일로 출력
파일 문자 단위 입력 fgetc()
- fgetc()함수는 파일포인터와 연결된 파일에서 하나의 문자를 읽어 반환하여 ch변수에 저장한 후 화면에 출력한다.
데이터를 모두 읽은 경우 반복을 끝내야 하므로 fgetc() 함수의 반환값을 반복문의 종료 조건에 사용한다.
"fgetc() 함수는 파일의 데이터를 모두 읽으면 EOF를 반환한다."
파일 문자 출력
#include<stdio.h>
int main()
{
FILE *fp;
int c;
fp = fopen("test.txt", "w");
if(fp == NULL){
printf("파일열기 실패\n");
} else {
printf("파일열기 성공\n");
}
while((c = fgetc(fp)) != EOF){
putchar(c);
}
fclose(fp);
return 0;
}
=> EOF 란 End of File 의 약자로 파일의 끝을 나타내는 특수문자입니다.
즉 fgetc를 통해서 파일 포인터가 이동하며 최종적으로 EOF에 도달하면 반복문에서 빠져나와 파일 내용의 전부를 출력하는 형태.

문자열 단위 입출력
#include<stdio.h>
#include<memory.h>
#include<string.h>
int main()
{
FILE *fp;
char file_buff[100];
fp = fopen("test_line.txt", "w");
if (fp == NULL) printf("파일열기 실패\n");
else printf("파일열기 성공\n");
int i;
for (i = 1; i <= 5; i++) {
printf("파일에 적을 내용을 입력하세요 (%d번째 라인)\n", i);
memset(file_buff, 0, sizeof(file_buff));
scanf("%s", file_buff);
file_buff[strlen(file_buff)] = '\n';
fputs(file_buff, fp);
}
fclose(fp);
fp = fopen("test_line.txt", "r");
if (fp == NULL) printf("파일열기 실패\n");
else printf("파일열기 성공\n");
while(fgets(file_buff, sizeof(file_buff), fp) != NULL){
printf("%s", file_buff);
memset(file_buff, 0, sizeof(file_buff));
}
fclose(fp);
return 0;
}
***memset의 경우 memory.h 헤더파일에 포함된 함수: memset() 함수를 이용해서 File buf에 있는 값을 0으로 초기화 해주는 작업
=> file_buff[strlen(file_buff)] = '\n';
file buffer에 줄바꿈 문자인 \n(개행)을 마지막 라인에 포함하여 해당 버퍼를 fputs를 이용해서 파일에 입력.


타입지정 예제
#include<stdio.h>
int main()
{
FILE *fp;
char name[20];
int age;
double height;
double ave_age = 0;
if ((fp = fopen("user_info.txt", "w")) == NULL) {
printf("파일열기 실패\n");
}
int i;
for (i = 0; i < 5; i++) {
printf("%d번째 유저정보를 입력 (나이, 이름, 키 순): ", i);
scanf("%d %s %lf", &age, name, &height);
fprintf(fp, "%d %s %lf\n", age, name, height);
}
fclose(fp);
if ((fp = fopen("user_info.txt", "r")) == NULL) {
printf("파일열기 실패\n");
}
for (i = 0; i < 5; i++) {
fscanf(fp, "%d %s %lf", &age, name, &height);
ave_age += (double)age;
}
printf("유저들의 평균나이 : %0.2lf\n", ave_age / 5);
fclose(fp);
return 0;
}


입력한 내용을 토대로 user_info 파일이 만들어지고 선언한 자료형에맞게 입력되었다.