C 언어에서 현재 파일 위치를 건드리지 않고 특정 위치에 기록하려면 pwrite()를 쓴다.
작게 실행해 보기
#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;
}
ssize_t n = pwrite(fd, "XY", 2, 0);
if (n < 0) {
fclose(fp);
return 1;
}
printf("written=%zd\n", n);
if (fclose(fp) == EOF)
return 1;
return 0;
}현재 파일 위치가 끝에 있어도 offset 0에 XY를 쓴다. 원래 파일 위치는 그대로다.
반환값과 주의점
실제 기록 바이트 수를 반환하고 오류는 -1이다. 부분 쓰기를 처리해야 한다.
offset은 바이트 단위다. 리눅스에서 O_APPEND로 연 파일은 지정 위치 대신 파일 끝에 기록되는 문제가 있으므로 위치 기록용 파일의 열기 모드를 구분한다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기