0w0
고수준 파일 입출력 본문
//ex2_6.c
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
int main(void){
int fd, n;
off_t start, cur;
char buf[256];
fd=open("unix.txt", O_RDONLY);
//unix.txt 파일을 읽기 전용으로 연다.
if(fd==-1){
perror("Open unix.txt");
exit(1);
}
start=lseek(fd, 0, SEEK_CUR);
//파일의 현재 위치를 파악해보면 오프셋이 0임을 알 수 있다.
n=read(fd, buf, 255);
buf[n]='\0';
printf("Offset start=%d, Read Str=%s, n=%d\n", (int)start, buf, n);
cur=lseek(fd, 0, SEEK_CUR);
//데이터를 읽은 후 현재 위치를 확인한다(예제에서는 오프셋이 start+n 위치로 이동한다.)
printf("Offset cur=%d\n", (int)cur);
start=lseek(fd, 5, SEEK_SET);
n=read(fd, buf, 255);
//파일의 시작 기준으로 오프셋이 5인 위치로 이동한 후 데이터를 읽는다.
buf[n]='\0';
printf("Offset start=%d, Read Str=%s",(int)start, buf);
close(fd);
return 0;
}
//실행 결과를 보면 오프셋의 위치에 따라 읽어온 데이터가 다름을 알 수 있다.
//문자 기반 입출력 함수 사용하기 ex2_11
#include<stdlib.h>
#include<stdio.h>
int main(void){
FILE *rfp, *wfp;
int c;
if((rfp=fopen("unix.txt","r"))==NULL){
//읽어올 파일을 열고
perror("fopen:unix.out");
exit(1);
}
if((wfp=fopen("unix.out","w"))==NULL){
//출력할 파일을 연다.
//파일을 열기에 실패하면 NULL이 리턴된다.
perror("fopen: unix.out");
exit(1);
}
while((c=fgetc(rfp))!=EOF){
/*fetc함수를 이용해 EOF를 만날 때까지 한 문자씩 읽어들인다.
fputc(c,wfp);
}
fclose(rfp);
fclose(wfp);
//모든 작업을 완료하면 열려 있는 두 파일을 포인터를 사용해 닫는다.
return 0;
}
//문자열 기반 입출력 함수 사용하기 ex2_12
#include<stdlib.h>
#include<stdio.h>
int main(void){
FILE *rfp, *wfp;
char buf[BUFSIZ];
if((rfp=fopen("unix.txt","r"))==NULL){
perror("fopen:unix.out");
exit(1);
}
if((wfp=fopen("unix.out","a"))==NULL){
perror("fopen: unix.out");
exit(1);
}
while(fgets(buf, BUFSIZ, rfp)!=NULL){
fputs(buf,wfp);
}
fclose(rfp);
fclose(wfp);
//모든 작업을 완료하면 열려 있는 두 파일을 포인터를 사용해 닫는다.
return 0;
}
//fread 함수로 파일 읽기 ex2_13
#include<stdlib.h>
#include<stdio.h>
int main(void){
FILE *rfp;
char buf[BUFSIZ];
int n;
if((rfp=fopen("unix.txt","r"))==NULL){
perror("fopen:unix.txt");
exit(1);
}
while((n=fread(buf, sizeof(char)*2, 3, rfp))>0){
buf[6]='\0';
printf("n=%d buf=%s\n", n, buf);
}
fclose(rfp);
return 0;
}
/*실행 결과를 보면 한 번에 6바이트씩 끊어서 읽어왔음을 알 수 있다.*/
//리턴값을 저장한 n에서 한 번에 3개 항목을 읽었음을 알 수 있다.
#include<stdlib.h>
#include<stdio.h>
int main(void){
FILE *rfp;
int id, s1, s2, s3, s4, n;
if((rfp=fopen("unix.dat","r"))==NULL){
perror("fopen: unix.dat");
exit(1);
}
printf("학번 평균\n");
while((n=fscanf(rfp, "%d %d %d %d %d", &id, &s1, &s2, &s3, &s4, n))!=EOF){
printf("%d : %d \n",id,(s1+s2+s3+s4)/4);
}
fclose(rfp);
return 0;
}
//fprintf 함수 사용하기 ex2_16.c
#include<stdlib.h>
#include<stdio.h>
int main(void){
FILE *rfp, *wfp;
int id, s1, s2, s3, s4, n;
if((rfp=fopen("unix.dat","r"))==NULL){
perror("fopen: unix.scr");
exit(1);
}
if((wfp=fopen("unix.scr","w"))==NULL){
perror("fopen: unix.scr");
exit(1);
}
fprintf(wfp, "학번 평균\n");
while((n=fscanf(rfp, "%d %d %d %d %d", &id, &s1, &s2, &s3, &s4))!=EOF){
fprintf(wfp, "%d : %d\n",id,(s1+s2+s3+s4)/4);
}
fclose(rfp);
fclose(wfp);
return 0;
}
//fseek함수 사용하기 ex2_17.c
#include<stdlib.h>
#include<stdio.h>
int main(void){
FILE *fp;
int n;
long cur;
char buf[BUFSIZ];
if((fp=fopen("unix.txt","r"))==NULL){
perror("fopen: unix.txt");
exit(1);
}
cur=ftell(fp);
//ftell 함수로 현재 오프셋을 확인한다.
printf("Offset cur=%d\n",(int)cur);
n=fread(buf, sizeof(char), 4 ,fp);
buf[n]='\0';
printf("-- Read Str=%s\n",buf);
fseek(fp, 1, SEEK_CUR);
/*현재 오프셋을 기준으로 1만큼 이동한다. 18행에서 4바이트를 읽어서 현재 오프셍이 4였는데, 22행의 실행
결과로 오프셋이 5로 이동한다. 이 오프셋은 "Unix System Programming에서 'S'에 해당하는 위치다.*/
cur=ftell(fp);
printf("Offset cur=%d\n", (int)cur);
n=fread(buf, sizeof(char), 6, fp);
buf[n]='\0';
printf("-- Read Str=%s\n",buf);
cur=12;
fsetpos(fp, &cur);
/*fsetpos 함수로 오프셋을 파일의 시작에서 12바이트 만크 이동시킨다. 즉, unix.txt파일의 내용에서 문자 'P'로 위치시킨다.*/
fgetpos(fp,&cur); //fsetpos 함수로 현재 오프셋을 확인한다.
printf("Offset cur=%d\n",(int)cur);
n=fread(buf, sizeof(char),13, fp);
buf[n]='\0';
printf("-- Read Str=%s\n", buf);
fclose(fp);
return 0;
}
//tmpfile 함수 사용하기 ex2_21.c
#include<stdio.h>
int main(void){
FILE *fp;
fp=tmpfile();
//임시 파일을 생성한다.
fputs("unix system",fp);
//생성한 임시 파일에 "unix system"이라는 문자열을 출력한다.
fclose(fp);
return 0;
}
/*파일명을 모르므로 결과를 확인할 수 없다. 프로그램 내에서 문자 그대로 임시로 사용하는 것이다.*/
'Coding > System Programming' 카테고리의 다른 글
저수준 파일 입출력 (0) | 2016.10.06 |
---|---|
명령행 인자 출력 ex1_6.c ex1_7.c (0) | 2016.09.28 |
동적 메모리 할당 malloc realloc (0) | 2016.09.28 |
오류 처리 함수 perror함수, str-error함수 (0) | 2016.09.27 |
Makefile과 make ex1_3_main.c ex1_3_addnum.c (0) | 2016.09.27 |