저는 최근 UNIX 환경에서 프로그래밍을 시작했습니다. 이 명령을 사용하여 터미널에 지정된 이름과 크기로 빈 파일을 생성하는 프로그램을 작성해야 합니다.
gcc foo.c -o foo.o
./foo.o result.txt 1000
여기서 result.txt는 새로 생성된 파일의 이름을 나타내고, 1000은 파일 크기(바이트)를 나타냅니다.
나는 확신한다찾다함수는 파일 오프셋을 이동하지만 문제는 프로그램을 실행할 때마다 주어진 이름의 파일을 생성하지만 파일 크기가 다음과 같다는 것입니다.0.
이것은 내 애플릿의 코드입니다.
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
int main(int argc, char **argv)
{
int fd;
char *file_name;
off_t bytes;
mode_t mode;
if (argc < 3)
{
perror("There is not enough command-line arguments.");
//return 1;
}
file_name = argv[1];
bytes = atoi(argv[2]);
mode = S_IWUSR | S_IWGRP | S_IWOTH;
if ((fd = creat(file_name, mode)) < 0)
{
perror("File creation error.");
//return 1;
}
if (lseek(fd, bytes, SEEK_SET) == -1)
{
perror("Lseek function error.");
//return 1;
}
close(fd);
return 0;
}
답변1
파일의 끝을 보고 있는 경우 해당 위치에 최소 1바이트를 써야 합니다.
write(fd, "", 1);
운영 체제가 공백을 0으로 채우도록 합니다.
따라서 특정 크기 1000 의 빈 파일을 생성하려면 lseek
다음을 수행하십시오.
lseek(fd, 999, SEEK_SET); //<- err check
write(fd, "", 1); //<- err check
ftruncate
아마도 더 나을 것이며, 쉽게 희소 파일을 생성하는 것 같습니다.
ftruncate(fd, 1000);
답변2
파일에 아무것도 쓰지 않았습니다.
파일을 열고 파일 설명자를 이동한 다음 닫습니다.
lseek 매뉴얼 페이지에서
lseek() 함수는 파일 설명자 fildes의 오프셋을 명령어에 따라 인수 오프셋으로 재배치합니다.
답변3
맨 페이지에서 -
The lseek() function allows the file offset to be set beyond the end of the file (but this does not change the size of the file). If
data is later written at this point, subsequent reads of the data in the gap (a "hole") return null bytes ('\0') until data is actually written into the gap.
호출을 사용하여 truncate/ftruncate
파일 크기를 설정합니다.