C 언어에서 파일의 다른 위치를 잠깐 읽되 현재 파일 위치를 바꾸고 싶지 않을 때 pread()가 편하다.
작게 실행해 보기
#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;
}
char data[4] = {0};
ssize_t n = pread(fd, data, 3, 2);
if (n < 0) {
fclose(fp);
return 1;
}
printf("%.*s\n", (int)n, data);
if (fclose(fp) == EOF)
return 1;
return 0;
}파일 시작에서 2바이트 뒤의 cde를 읽는다. 공유된 현재 파일 위치는 바꾸지 않는다.
반환값과 주의점
읽은 바이트 수, EOF이면 0, 오류이면 -1이다. 요청한 크기보다 적게 읽을 수 있다.
offset은 파일 시작부터의 바이트 위치다. lseek()와 read()를 따로 부르는 것과 달리 공유 파일 위치를 움직이지 않는다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기