0w0

고수준 파일 입출력 본문

Coding/System Programming

고수준 파일 입출력

0w0 2016. 10. 11. 12:09
728x90
반응형

//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개 항목을 읽었음을 알 수 있다.










//fread 함수로 파일 읽기 ex2_14
#include<stdlib.h>
#include<stdio.h>

int main(void){
        FILE *rfp, *wfp;
        char buf[BUFSIZ];
int n;

        if((rfp=fopen("unix.txt","r"))==NULL){
                perror("fopen:unix.txt");
                exit(1);
        }
if((wfp=fopen("unix.out", "a"))==NULL){
perror("fopen: unix.out");
exit(1);
}

while((n=fread(buf,sizeof(char)*2, 3, rfp))>0){
fwrite(buf, sizeof(char)*2, n, wfp);
}
        fclose(rfp);
        return 0;
}
/*실행 결과를 보면 한 번에 6바이트씩 끊어서 읽어왔음을 알 수 있다.*/
//리턴값을 저장한 n에서 한 번에 3개 항목을 읽었음을 알 수 있다.





//fscanf 함수 사용하기 ex2_15.c

#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;

}






//fdopen 함수 사용하기 ex2_18.c
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>

int main(){
FILE *fp;
int fd;
char str[BUFSIZ];

fd=open("unix.txt",O_RDONLY);
//저수준 파일 입출력 함수인 open으로 파일을 연다.

if(fd==-1){
perror("open");
exit(1);
}

fp=fdopen(fd,"r");
//fdopen 함수를 사용해 파일 포인터를 생성한다.

fgets(str, BUFSIZ, fp);
//파일 포인터를 통해 고수준 파일 입출력 함수로 데이터를 읽는다.
printf("Read : %s\n",str);

fclose(fp);

return 0;
}








//fileno 함수 사용하기 ex2_19.c
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>

int main(void){
FILE *fp;
int fd, n;
char str[BUFSIZ];

fp=fopen("unix.txt","r");
/*fopen으로 파일을 열고 리턴받은 파일 포인터에서 파일 기술자를 추출한다.
결과에서 볼 수 있듯이 파일 기술자는 3이다.*/
if(fp==NULL){
perror("fopen");
exit(1);
}

fd=fileno(fp);
printf("fd : %d\n",fd);

n=read(fd, str, BUFSIZ);
//파일 기술자를 이용해 저수준 파일 입출력 함수로 데이터를 읽는다.
str[n]='\0';
printf("Read:%s\n",str);
/*읽은 데이터에는 문자열의 끝을 표시하는 널이 포함되지 않으므로 강제로
널값을 삽입하고, 출력한다.*/
close(fd);

return 0;
}
/*결과를 보면 파일 기술자가 3번으로 할당되었고, unix.txt 파일의 내용을 모두
읽고 출력했음을 알 수 있다.*/





//임시 파일명 만들기 ex2_20.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void){
char *fname;
char fntmp[BUFSIZ];
char template[32];

fname=tmpnam(NULL);
printf("1. TMP File Name(tmpnam):%s\n",fname);

tmpnam(fntmp);
//인자로 지정한 배열에 임시 파일명을 저장한다.
printf("2. TMP File Name(tempnam):%s\n",fntmp);

fname=tempnam("/tmp","hanbit");
//tempnam 함수를 사용해 임시 파일명으로 사용할 디렉토리와 접두어를 지정한다.
printf("3. TMP File Name(tempnam): %s\n",fname);
//tmpnam 함수에 인자를 NULL로 지정해 임시 파일명을 리턴값으로 받는다.

strcpy(template,"/tmp/hanbitXXXXXX");
fname=mktemp(template);
//임시 파일명의 템플릿을 생성하고 mktemp로 임시 파일명을 생성한다.
printf("4. TMP File Name(mktemp) : %s \n",fname);
return 0;
}

/*실행 결과를 보면 tmpnam 함수로 만든 임시 파일명은 디렉토리가 /var/tmp임을 
알 수 있다. tempnam 함수로 생성한 임시 파일명의 접두어는 한 글자 잘렸음을 알 수 있는데,
이 함수는 접두어를 5글자만 허용하기 때문이다.*/



//tmpfile 함수 사용하기  ex2_21.c

#include<stdio.h>


int main(void){

FILE *fp;


fp=tmpfile();

//임시 파일을 생성한다.

fputs("unix system",fp);

//생성한 임시 파일에 "unix system"이라는 문자열을 출력한다.

fclose(fp);


return 0;

}

/*파일명을 모르므로 결과를 확인할 수 없다. 프로그램 내에서 문자 그대로 임시로 사용하는 것이다.*/

728x90
반응형
Comments