8.3.3 순차 파일의 레코드 추가
> 레코드 추가를 위한 사용 모드
a, a+, ab, ab+
- 형식 : fp = fopen('파일명", "a");
- 사용 예 : fp = fopen("samlpe.dat", "a");
- 기능 : 이미 만들어진 순차파일의 끝에 새로운 레코드 추가(append)
//레코드 추가의 사용 예
#include <stdio.h>
void main(){
FILE *fp;
fp = fopen("sample4.txt", "a");
fputs("Cho DS \n", fp);
fputs("Han JK \n", fp);
fputs("Kang MH \n", fp);
fclose(fp); }
8.4 랜덤 파일 random file 처리
- 파일의 임의의 위치에서 자료를 읽거나 쓸 수 있다.
- 레코드의 길이가 일정
> 순차파일에 비해
- 단점 : 기억공간 낭비
- 장점 : 레코드 검색이 빠르고 효과적
8.4.1 랜덤 파일 열기
일반적으로 랜덤파일을 입출력할 때는 2진 모드로 파일을 개방
fopen("파일 이름", "wb")
fopen("파일 이름", "rb")
2진 모드의 특징
- 텍스트 파일보다 적은 기억공간
- 레코드의 길이를 프로그래머가 결정
- 파일 포인터의 위치 변경 가능
8.4.2 랜덤 파일 만들기
(1) fwrite() 함수
- 형식 : fwrite(저장 자료 변수, 레코드 길이, 레코드 개수, 파일 포인터);
- 사용 예 : fwrite(name, 10, 1, fp);
- 레코드의 길이를 지정
- 자료저장 변수는 포인터 형
//fwrite() 함수의 사용 예
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(){
FILE *fp;
char name[10];
if((fp = fopen("sample5.dat", "wb"))==NULL){
// sample5.dat 파일을 2진 파일 쓰기 모드로 개방 // sample5.dat 파일이 생성됨
put("파일을 개방할 수 없습니다!");
exit(1); }
printf("이름을 입력하시오. 입력을 끝내려면 'END'를 입력하시오. \n");
gets(name);
while(strcmp(name, "END")){ // 입력 문자열이 END가 아닐 동안 loop 계속
fwrite(name, 10, 1, fp); // 2진 파일에 쓰기
gets(name); } fclose(fp); }
8.4.3 랜덤 파일 읽기
(1) fread() 함수
- 형식 : fread(읽을 자료변수, 레코드 길이, 레코드 개수, 파일 포인터);
- 사용 예 : fread(name, 10, 1, fp);
- 읽기에 성공하면 레코드 수를 리턴
// fread() 함수의 사용 예
#include <stdio.h>
#include <stdlib.h>
void main(){
FILE *fp;
char name[10];
if((fp=fopen("sample5.dat", "rb"))==NULL){
// sample5.dat 파일을 2진 파일 읽기 모드로 개방 // 파일읽어 오기
puts("파일을 개방할 수 없습니다!");
exit(1); }
while(1){
if(fread(name, 10, 1, fp) != 1)
// 레코드의 개수가 1이므로 1이 아닌 값이 리턴되면 (즉, 파일의 끝이므로) while문을 벗어남
break;
puts(name); } fclose(fp); }
8.4.4 랜덤 파일의 위치 제어
(1) fseek() 함수의 사용
> 파일 포인터를 임의의 위치로 이동시키는 함수
> 랜덤파일의 특정부분을 입출력할 수 있다.
- 형식 : fseek(파일포인터 변수, 이동할 상대위치, 기준위치를 지정하는 모드);
- 사용 예 : fseek(fp, 2*REC_size, SEEK_SEK):
> 기준 위치로부터 앞, 뒤로 이동하는 상대위치 개념 사용
fseek() 함수의 기준위치 지정모드
--- stdio.h에 정의됨
** fseek() 함수에 대한 그림 표현
// fseek() 함수의 사용 예
#include <stdio.h>
#include <string.h>
void main(){
char str[10];
FILE *fp = fopen("sample6.txt", "wt");
fputs("1234567890", fp);
fclose(fp);
fp = fopen("sample6.txt", "rt");
fseek(fp, 7, SEEK_SET);
fgets(str, 4, fp);
printf("7번째부터 3글자 출력 : %s \n", str);
fseek(fp, -2, SEEK_CUR);
fgets(str, 3, fp);
printf("현재 위치에서 앞의 2글자부터 2글자 출력 : %s \n", str);
fseek(fp, -9, SEEK_END);
fgets(str, 6, fp);
printf("맨 뒤에서 9번째 앞부터 5글자 출력 : %s \n", str);
fclose(fp); }
(2) ftell() 함수의 사용
ftell() 함수는 현재 파일 위치 지시자가 포인트하는 곳이 파일의 처음부터 몇 바이트 떨어진 곳인지를 알려 준다.
- 형식 : ftell(파일 포인터 변수):
- 사용 예 : ftell(fp);
//ftell() 함수의 사용 예
#include <stdio.h>
void main(){
long pos;
int i;
FILE *fp = fopen("sample7.txt", "wt");
fputs("1234#", fp); // 파일에 문자열 쓰기
fclose(fp);
fp = fopen("sample7.txt", "rt");
for(i=0; i<4; i++){
putchar(fgetc(fp)); // 파일로부터 한 글자씩 읽어 화면에 출력
pos = ftell(fp); // 현재 파일 위치 지시자 정보를 변수 pos에 저장
fseek(fp, -1, SEEK_END);
putchar(fgetc(fp));
fseek(fp, pos, SEEK_SET); } fclose(fp); }
// 저장해 놓은 정보를 참조하여 파일 위치자를 이전 위치로 되돌림
'방송통신대학 > C 프로그래밍' 카테고리의 다른 글
메모리 동적 할당 함수 dynamic allocation (0) | 2020.06.25 |
---|---|
메모리 정적할당static aloocation (1) | 2020.06.24 |
순차 파일 읽기 getc() , fgetc(), fgets(), fscanf() (0) | 2020.06.20 |
순차 파일 putc() fputs() fprintf() (0) | 2020.06.19 |
파일처리함수 (fclose, 파일 닫기) (0) | 2020.06.18 |