C 언어에서 파일 번호에서 바이트를 읽는 기본 함수가 read()다. 버퍼 크기를 넘긴다고 그만큼을 반드시 채워 주지는 않는다.
작게 실행해 보기
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/uio.h>
int main(void) {
FILE *fp = tmpfile();
if (!fp)
return 1;
if (fputs("abcdef", fp) == EOF || fflush(fp) == EOF) {
fclose(fp);
return 1;
}
int fd = fileno(fp);
if (fd < 0) {
fclose(fp);
return 1;
}
if (lseek(fd, 0, SEEK_SET) < 0) {
fclose(fp);
return 1;
}
char data[7] = {0};
ssize_t n = read(fd, data, 6);
if (n < 0) {
fclose(fp);
return 1;
}
printf("bytes=%zd text=%.*s\n", n, (int)n, data);
if (fclose(fp) == EOF)
return 1;
return 0;
}임시 파일에 준비한 abcdef를 읽고 반환 길이만 출력한다. 여기서는 6바이트지만 일반 읽기가 항상 요청량을 채우는 것은 아니다.
반환값과 주의점
양수는 읽은 바이트 수, 0은 보통 파일 끝, -1은 오류다. UDP에서 빈 데이터그램을 읽는 경우도 0일 수 있다.
반환한 길이만큼만 사용한다. 문자열 종료 문자도 자동으로 붙지 않는다. 한 번 읽고 끝낼지, 필요한 길이까지 반복할지는 파일과 통신 방식에 맞춰 정한다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기