-들어가기 앞서
c언어 어 파일 입출력 함수는 크게 2가지로 나뉜다 .
1. 저수준 파일 입출력 함수 (버퍼 사용 x)
2. 고수준 파일 입출력 함수 (버퍼사용)
고수준 파일 입출력 함수 위주로 알아본다.
C 언어에서 스트림은 stdio.h 안에 정의되어 있는 FILE 구조체이다.
stdio.h 에서 제공하는 표준 입출력 스트림 (stdout,stdin,stderr)
또한 파일 끝에는 파일 끝을 표시하는 EOF 데이타가 존재한다
파일의 종류.
파일은 2가지 종류로 나눌수 있다.
1. 텍스트 파일
2. 이진파일
텍스트 파일의 경우 1byte 씩 읽어와서 아스키 코드에 맞게 해석 한다.
이진파일 의 경우 그딴거 없이 1과 0 으로된 데이터 자체를 읽어온다.
사실 데이터 자체는 모두 2진수로 이루어져있다 그저 이진수로 저장되어 있는 데이터 파일을 어떻게 읽을 것인가를
결정 할 뿐이다.
2가지 파일을 타입의 파일 입출력을 다루기 전에 두가지 모드를 설정할수 있는 open mode 를 간단히 정리했다.
cf) open mode
r : Open for reading only. (읽기 전용)
w : Create for writing. If a file by that name already exists, it will be overwritten.
(쓰기용으로 파일생성, 동일이름이 있다면 덮어씀.)
a : Append; open for writing at end-of-file or create for writing if the file does not exist.
(동일명 파일 존재시 끝에 이어씀, 동일명 파일 없으면 쓰기용 파일 생성)
r+ : Open an existing file for update (reading and writing).
(현재 있는 파일에 read/write 모두 덮어씀.)
w+ : Create a new file for update (reading and writing).
If a file by that name already exists, it will be overwritten.
(읽기/쓰기용으로 파일 생성. 같은 파일 존재시 덮어)
a+ : Open for append; open (or create if the file does not exist) for update at the end of the file.
(파일이있으면 뒤에 추가, 업다면 새로 생성)
t : Text Mode (텍스트 모드)
b : Binary Mode (이진 파일 모드)
출처: https://jjangdali.tistory.com/entry/CC-fopen-함수의-옵션값-정리 [Egoist]
1. 텍스트 모드 읽고 쓰기
fopen_s , fclose, fgetc, fputc 사용 예제
fgetc : 문자열 1개 입력 받음
fputc : 문자열 1개 출력
#include<stdio.h>
int main()
{
char ch, * p;
char str[] = "Hellow World";
FILE* fin, * fout;
//fopen_s 함수는 파일을 성공적으로 열면 0 return
if (0 != fopen_s(&fout, "data.txt", "w"))
{
printf("File Open Error\n");
exit(1);
}
p = str ;
while (*p)//p* 가 null 문자를 만날 때까지
{
fputc(*p++, fout);
}
fclose(fout); // 스트림 닫아야지 다시 열 수 있다
if (0 != fopen_s(&fin, "data.txt", "r"))
{
printf("File Open Error\n");
exit(1);
}
while ((ch = fgetc(fin))!=EOF)
{
putchar(ch);
}
fclose(fin);
return 0;
}
문자열 입출력 함수 : fgets(),fputs()
char * fgets(char *str , int n , FILE *fp)
str: 파일 에 읽어 들인 문자열 저장할 공간에 대한 포인터
n: 읽어 들일 문자열의 최대 길이
fp 대상이 되는 파일 포인터
int fputs(char *str , FILE *fp)
str 파일에 기록할 문자열
fp 파일 포인터
fscanf()_s, fprintf()
서식화된 파일 입출력 예시
fscanf()_s 은 자신이 받은 데이터 갯수 만클 int 형을 return 한다.
ctrl z 를 3번 입력 받거나 파일의 끝 EOF 를 만나면 EOF 를 return 한다.
EOF = -1 이다.
#include<stdio.h>
int main()
{
FILE* fp;
int cnt1 = 0;
int cnt2 = 0;
int eng, math;
char str[20];
char* fname = "result.txt";
if (0 != fopen_s(&fp, fname, "w")) // 읽기 모드로 파일 열기
{
printf("File Open Error\n");
exit(1);
}
fflush(stdin); // 표준 입력 버퍼 비우기
while (1)
{
printf("===============\n");
printf("eng math name 입력하시오 \n");
printf("===============\n");
// return 값은 입력 받은 데이터 갯수 or eof 이다.
cnt1 = scanf_s("%d %d ", &eng, &math); // Ctrl z 3 번 눌러야 eof return
printf("cnt1 %d\n", cnt1);
if (cnt1 = !2 || cnt1 == EOF)
{
break;
}
cnt2 = scanf_s("%s", str, 20);
printf("cnt2 %d\n", cnt2);
if (cnt2 = !1 || cnt2 == EOF)
{
break;
}
printf("입력값 : %d %d %s\n", eng, math, str);
fprintf(fp, "%3d %3d %s\n", eng, math, str);
fflush(stdin); // 표준 입력 버퍼 비우기
}
fclose(fp);
printf("입력 완료\n");
if (0 != fopen_s(&fp, fname, "r")) // 쓰기 모드로 파일 열기
{
printf("File Open Error\n");
exit(1);
}
while (1)
{
cnt1 = fscanf_s(fp, "%d %d ", &eng, &math); // Ctrl z 3 번 눌러야 eof return
if (cnt1 = !2 || cnt1 == EOF)
{
break;
}
cnt2 = fscanf_s(fp, "%s", str, 20);
if (cnt2 = !1 || cnt2 == EOF)
{
break;
}
printf("% d % d % s\n", eng, math, str);
}
fclose(fp);
printf("출력 완료\n");
return 0;
}
2. 이진 파일 모드 읽고 쓰기
fwrite(),fread()
size_t fread(void *buffer ,size_t size , size_t n, FIEL *fp)
buffer : 파일로 부터 읽어 들인 데이터를 기억 시킬 버퍼를 가리키는 포인터
size : 읽어 들일 데이터의 바이트 수
n: n 번 데이터를 읽어옴
fp : 대상이 되는 파일 포인터
size_t fwrite(void *buffer ,size_t size , size_t n, FIEL *fp)
fread 와 동일하다.
#include<stdio.h>
typedef struct score
{
int eng, math;
char name[20];
} STUCENT_SCORE;
int main ()
{
FILE* fp;
int cnt1 = 0;
int cnt2 = 0;
STUCENT_SCORE s,sCopy;
char* fname = "result.dat";
if (0 != fopen_s(&fp, fname, "wb")) // 읽기 모드로 파일 열기
{
printf("File Open Error\n");
exit(1);
}
fflush(stdin); // 표준 입력 버퍼 비우기
while (1)
{
printf("===============\n");
printf("eng math name 입력하시오 \n");
printf("===============\n");
// return 값은 입력 받은 데이터 갯수 or eof 이다.
cnt1 = scanf_s("%d %d", &s.eng, &s.math); // Ctrl z 3 번 눌러야 eof return
printf("cnt1 %d\n", cnt1);
if (cnt1 = !2 || cnt1 == EOF)
{
break;
}
cnt2 = scanf_s("%s", s.name, 20);
printf("cnt2 %d\n", cnt2);
if (cnt2 = !1 || cnt2 == EOF)
{
break;
}
fwrite(&s, sizeof(STUCENT_SCORE), 1, fp);
fflush(stdin); // 표준 입력 버퍼 비우기
}
fclose(fp);
printf("프린트 할라믄 아무키나 누리세요\n");
getch();
if (0 != fopen_s(&fp, fname, "rb")) // 읽기 모드로 파일 열기
{
printf("File Open Error\n");
exit(1);
}
fflush(stdin);
while (1)
{
cnt1 = fread(&sCopy, sizeof(STUCENT_SCORE), 1, fp);
if (cnt1 == 0 || cnt1 == EOF) break;
printf("%d %d %s\n", sCopy.eng, sCopy.math, sCopy.name);
}
fclose(fp);
return 0;
}
'공부,일 > c언어' 카테고리의 다른 글
c 언어 공부 추천 블로그 (0) | 2021.06.09 |
---|---|
랜덤 액세스 :fseek(),ftell() (0) | 2021.06.07 |
구조체의 padding (0) | 2021.06.04 |
공용체 (0) | 2021.06.04 |
비트필드 (0) | 2021.06.03 |
댓글