read() 파일 읽기

Language/C 2012. 5. 11. 10:00

설명

open() 함수로 열기를 한 파일의 내용을 읽기를 합니다.

헤더unistd.h
형태ssize_t read (int fd, void *buf, size_t nbytes)
인수int fd파일 디스크립터
 void *buf파일을 읽어 들일 버퍼
 size_t nbytes퍼버의 크기
반환ssize_t정상적으로 실행되었다면 읽어들인 바이트 수를, 실패했다면 -1을 반환
예제

예제에 사용할 test.txt 파일에는 아래와 같이 5바이트씩 문장이 입력되어 있습니다.

12345
ABCDE
abcde
67890

표준 출력함수 fgets() 에는 버퍼가 크더라도 파일의 첫 번째 행만 읽어서 반환하지만 read()는 버퍼의 크기만큼 읽을 수 있다면 모두 읽어 들입니다. 그러므로 read()에서 사용할 버퍼의 크기가 파일 보다 크다면 파일의 모든 내용을 읽어 들이게 됩니다.

아래는 test.txt의 파일 내용보다 버퍼의 크기가 1024로 크기가 크므로 한번에 읽기를 해서 파일의 모든 내용을 출력하는 예제입니다.

#include <stdio.h>         // puts()
#include <string.h>        // strlen()
#include <fcntl.h>         // O_WRONLY
#include <unistd.h>        // write(), close()

#define  BUFF_SIZE   1024

int main()
{
   char   buff[BUFF_SIZE];
   int    fd;

   if ( 0 < ( fd = open( "./test.txt", O_RDONLY)))
   {
      read( fd, buff, BUFF_SIZE);
      puts( buff);
      close( fd);
   }
   else
   {
      printf( "파일 열기에 실패했습니다.\n");
   }
   return 0;
}
]$ ./a.out
12345
ABCDE
abcde
67890
]$

만일 파일 내용보다 버퍼 크기가 작다면 여러번 읽기를 시도할 수 있습니다.

#include <stdio.h>         // puts()
#include <string.h>        // strlen()
#include <fcntl.h>         // O_WRONLY
#include <unistd.h>        // write(), close()

#define  BUFF_SIZE   5     // 버퍼의 크기가 작습니다.

int main()
{
   char     buff[BUFF_SIZE];
   int      fd;
   ssize_t  rd_size;

   if ( 0 < ( fd = open( "./test.txt", O_RDONLY)))
   {
      while( 0 < ( rd_size = read( fd, buff, BUFF_SIZE-1)))   //  4 byte씩 읽씁니다.
      {
         buff[rd_size]  = '\0';      // puts()를 위해 NULL을 대입
         puts( buff);
      }
      close( fd);
   }
   else
   {
      printf( "파일 열기에 실패했습니다.\n");
   }
   return 0;
}
]$ ./a.out
1234
5
AB
CDE

abcd
e
67
890
]$
  

'Language > C' 카테고리의 다른 글

inconv source (iconv_open, iconv, iconv_close)  (0) 2012.05.16
inconv.h  (0) 2012.05.16
execl 다른 프로그램 실행  (0) 2012.04.26
Why use select() instead of sleep()?  (0) 2012.04.26
아스키 코드 0x00 ~ 0x20 까지  (0) 2012.04.10
: