블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
     

    /* 학생의 레코드를 키보드로부터 입력받아 write() 함수를 이용하여 구조체 단위로 파일에 기록하고, 다시 열어서 read() 함수로 읽어서 화면에 출력하는 프로그램*/

    #include<stdio.h>

    #include<fcntl.h>

    #include<stdlib.h>

    #include<sys/stat.h>


    typedef struct // STUDENT 구조체의 정의

    {

            int id; // 학생번호

            char name[20];

            int year;

            int month;

            int day;

    }STUDENT;

    int main()

    {

            STUDENT st;

            int infd;

            int outfd;


            // 출력파일의 생성

            if((outfd = creat ("d11-10.out", S_IREAD | S_IWRITE))<0)

            {

                    printf("file create error!\n");

                    return -100;

            }

            close(outfd); // 파일의 속성을 기록하기 위해서 닫음

            // 출력파일을 쓰기 위해서 오픈

            if((outfd = open ("d11-10.out", O_WRONLY))<0)

            {

                    printf("file open error!\n");

                    return -10;

            }

            // 키보드로부터 학생 데이터를 입력받아 파일에 기록

            while(1)

            {

                    printf("\n학번이 음수이면 입력이 종료됨 id  :");

                    scanf("%d", &st.id);

                    if(st.id < 0)

                    {

                            break;

                    }

                    printf("name : ");

                    scanf("%s", st.name);

                    printf("birthday (yy/mm/dd) : ");

                    scanf("%d/%d/%d", &st.year, &st.month, &st.day);

                    write(outfd, &st, sizeof(STUDENT)); // 출력파일에 기록

            }

            close(outfd);

            // 출력파일을 읽기 위해서 열기

            if((infd = open("d11-10.out",O_RDONLY))<0)

            {

                    printf("file open error!\n");

                    return -1;

            }

            // 출력파일을 읽어서 화면에 출력

            while(read(infd, &st, sizeof(STUDENT)) >= sizeof(STUDENT))

            {

                    printf("\nid : %d", st.id);

                    printf("\nname : %s", st.name);

                    printf("\nbirhtday (yy/mm/dd) : %d/ %d/ %d", st.year, st.month, st.day);

            }

            close(infd);

            

            return 0;

    }

    ⇒ 출력 결과

     

    ⇒ write(outfd, &st, sizeof(STUDENT));

     → 키보드로부터 구조체 변수 st에 자료를 입력받은 뒤 파일에 입력받은 데이터를 저장하는 명령문이다. 두 번째 인수에 주소연산자 &가 붙은 것은 write() 함수의 두 번째 인수가 버퍼의 주소를 넘겨받기 때문이다. 예를 들면, int 형 변수 num을 파일에 기록할 경우 명령문은 다음과 같다.

            int num = 5;

            write (fd, &num, sizeof(int))

    ⇒ read(outfd, &st, sizeof(STUDENT));

     → read() 함수도 write() 함수와 같이 모든 자료형을 파일로부터 읽을 수 있다.


     

    ⇒ hexaview로 d11-10.out 파일을 불러왔다.

    ⇒ 빨간색으로 테두리 된 첫 번째 부분은 id를 의미한다. 처음 4칸은 1번 id를 뜻한다.

    ⇒ 두 번째 부분은 name이다. 입력한 이름이 char name[20]에 저장되어 있고 마지막은 NULL(00)이 입력되어있다. 그리고 20칸이 채워질 때까지 남은 부분은 미정값이 들어가 있다.

    ⇒ 다음으로 48 00 00 00 이 보이는데 이것은 Little Endian 으로 표시된 것이며 16진수 48은 10진수 76와 같다. 즉, 72이라고 입력한 yy 값이 16진수로 변환되어 little endian 방식으로 저장되었음을 알수있다. 다음에 차례대로 mm 값이 0C 00 00 00, dd 값이 11 00 00 00으로 나타나 있다.

    ⇒ 이렇게 하나의 값이 끝난 다음 첫 번째 초록색 칸을 보면 02 00 00 00 값이 보인다. 이것은 두 번째 ID 부분의 값이며 뒤이어 위와 같이 name과 yy/mm/dd 부분이 차례대로 나타난다.

     



    - 저수준 입출력에서의 임의접근

    ⇒ 저수준 파일 입출력에도 고수준의 경우처럼 임의의 접근이 가능하며, 이때 사용되는 함수들은 다음과 같다.

            long tell(int handle);

            long lseek(int handle, long offset, int fromwhere);

    ⇒ 위 함수의 사용방법은 고수준 파일 입출력의 ftell() 함수와 fseek() 함수와 동일하다. 이들 함수와이 차이점은 파일 포인터 대신 파일기술자(flle descriptor)가 인수로 넘겨지는 것 뿐이다.


    - 리다이렉션(redirection)

    ⇒ 표준입력장치인 키보드나 표준출력장치인 스크린을 대상으로 작성된 프로그램에서 키보드나 스크린 대신 입력이나 출력을 다른 파일로 바꾸어 주는 것


    // 키보드로부터 입력받은 문자를 화면에 출력하는 프로그램

    #include<stdio.h>

    int main()

    {

            char ch;

            while((ch=getchar()) != 'x1A')

            {

                    putchar(ch);

            }

            return 0;

    }

    ⇒ 출력 결과

     

    ⇒ 여기서 ‘x1A'는 ctrl-z에 해당하는 아스키 코드이며, 프로그램은 ctrl-z를 누름으로써 종료된다.

    ⇒ 이 프로그램은 키보드를 통해서 입력받은 문자들을 화면에 출력시킨다. 이 때 키보드 대신 d11-11.in 파일을 통하여 입력하고 싶을 때는 다음과 같이 리다이렉션 시킨다.

     → C:\> p11-11 < d11-11.out

    ⇒ 출력을 스크린 대신 d11-11.out 파일로 하고 싶은 경우에는 다음과같이 리다이렉션 시킨다.

     → C:\> p11-11 > d11-11.out

    ⇒ 입출력을 모두 리다이레션 시킬 경우에는 다음과 같이 리다이렉션 시킨다.

     → C:\> p11-11 < d11-11.in > d11-11.out


     

    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함