프로그래밍 기술/리눅스(Unix) 시스템 프로그래밍

[리눅스/유닉스 시스템 프로그래밍] read, write

언제나휴일 2016. 4. 5. 23:02
반응형

3.3 read, write

 파일을 열고 난 후에 데이터를 쓰거나 읽어올 때는 read write 함수를 사용합니다.

#include <unistd.h>

ssize_t read(int fd, void *buff, size_t nbytes);

반환 값: 읽어온 바이트 수, 실패 시 -1, 파일의 끝에서 시도하면 0

ssize_t write(int fd, const void *buff, size_t nbytes);

반환 값: 기록한 바이트 수, 실패 시 -1

 

 read 함수를 호출하였을 때 반환 값은 읽기 요청한 바이트 수보다 작은 값일 수 있습니다. 예를 들어 현재 읽어올 데이터가 100바이트 밖에 없는데 200바이트 읽기를 요청하면 100바이트를 읽고 100을 반환합니다. 따라서 요청한 바이트 수보다 작은 값을 반환하면 파일의 끝을 만난 것입니다.

 

 하지만 write 함수를 호출하면 정확히 요청한 바이트 수만큼 쓰여지고 반환 값도 요청한 바이트 수여야 합니다. 만약 쓰기를 실패하면 -1을 반환합니다. 참고로 ssize_t int와 같은 형식이고 size_t unsigned int와 같은 형식입니다.

 

 다음은 도서정보를 파일에 쓰고 난 후에 읽어와서 확인하는 테스트 코드입니다.

// ex_read_write.c

#include <stdio.h>

#include <fcntl.h>

#include <unistd.h>

#include <stdlib.h>

#define MAX_TIT_LEN 100

#define MAX_AUT_LEN 20

#define DUMMY_FNAME "dummy"

typedef struct _Book Book;

struct _Book

{

    char title[MAX_TIT_LEN+1];

    char author[MAX_AUT_LEN+1];

    int num;

};

void TestWrite();

void TestRead();

 

 

int main()

{

    TestWrite();

    TestRead();

    return 0;

}

void TestWrite()

{

    int fd = 0;

    Book books[3]={

        {"Unix System Programming with Linux","ehjang",1},

        {"Escort C Language","ehjang",2},

        {"Advanced Programming in the UNIX","Stevens",3}

    };

 

    fd = open(DUMMY_FNAME,O_WRONLY|O_CREAT|O_TRUNC,0644); //쓰기,생성,내용지움

    if(fd == -1)

    {

        perror("failed open dummy file.");

        exit(1);

    }

 

    int re = 0;

    re = write(fd, books, sizeof(books));

    if(re == -1)

    {

        perror("failed write ");

        exit(1);

    }

 

    printf("write %d bytes\n",re);

    close(fd);

}

 

 

void TestRead()

{

    int fd = 0;

    Book book;

    fd = open(DUMMY_FNAME,O_RDONLY);//읽기 전용

    if(fd == -1)

    {

        perror("failed open dummy file.");

        exit(1);

    }

    int re = 0;

    while((re = read(fd, &book, sizeof(Book))) >0)

    {

        printf("title:%s\n",book.title);

        printf("\tauthor:%s\n",book.author);

        printf("\tbook no:%d\n",book.num);

    }

    close(fd);

}

 


반응형