UNIX環境でCプログラミング言語を使用して空のファイルを生成するときに発生する問題

UNIX環境でCプログラミング言語を使用して空のファイルを生成するときに発生する問題

私は最近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);

オペレーティングシステムにスペースをゼロで埋めるようにします。

したがって、特定のサイズの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ファイルサイズを設定します。

関連情報