Problema com a criação de um arquivo vazio usando a linguagem de programação C no ambiente UNIX

2

Eu comecei recentemente a programar em ambiente UNIX. Eu preciso escrever um programa que cria um arquivo vazio com nome e tamanho dado no terminal usando esses comandos

gcc foo.c -o foo.o 
./foo.o result.txt 1000

Aqui resultado.txt significa o nome do arquivo recém-criado e 1000 significa o tamanho do arquivo em bytes.

Eu tenho certeza que a função lseek move o deslocamento do arquivo, mas o problema é que sempre que eu executo o programa, ele cria um arquivo com um nome dado, mas o tamanho do arquivo é 0 .

Aqui está o código do meu pequeno programa.

#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;
}
    
por Shahnur Isgandarli 26.02.2016 / 18:03

3 respostas

3

Se você está procurando após o final do arquivo, você tem que escrever pelo menos um byte nessa posição:

write(fd, "", 1);

para que o SO preencha o buraco com zeros.

Então, se você quiser criar um arquivo vazio de um determinado tamanho 1000 com lseek , faça:

lseek(fd, 999, SEEK_SET); //<- err check
write(fd, "", 1); //<- err check

ftruncate é provavelmente melhor e parece criar arquivos esparsos sem qualquer problema:

ftruncate(fd, 1000); 
    
por 26.02.2016 / 18:52
0

Você não está escrevendo nada no arquivo.

Você abre o arquivo, move o descritor de arquivo e, em seguida, o fecha.

Da página do manual do lseek

The lseek() function repositions the offset of the file descriptor fildes to the argument offset, according to the directive whence.

    
por 26.02.2016 / 18:16
0

Da página do manual -

  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 ('
  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 ('%pre%') until data is actually written into the gap.
') until data is actually written into the gap.

Use a chamada truncate/ftruncate para definir o tamanho do arquivo.

    
por 26.02.2016 / 18:24