在 UNIX 环境中使用 C 编程语言创建空文件时遇到问题

Trouble with creating an empty file using C programming language in UNIX environment

我最近开始在 UNIX 环境下编程。我需要编写一个程序,使用此命令创建一个空文件,其名称和大小在终端中给出

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

这里result.txt表示新建的文件名,1000表示文件大小,单位为字节。

我确定 lseek 函数会移动文件偏移量,但问题是每当我 运行 程序创建一个具有给定名称的文件时,但是文件的大小是 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;
}

如果不允许您使用任何其他函数来协助创建 "blank" 文本文件,为什么不在 creat 上更改文件模式然后循环写入:

int fd = creat(file_name, 0666);

for (int i=0; i < bytes; i++) {
    int wbytes = write(fd, " ", 1);
    if (wbytes < 0) {
        perror("write error")
        return 1;
    }
}

您可能希望在此处进行一些额外的检查,但这是一般的想法。

我不知道在你的情况下什么是可以接受的,但是,可能只在 lseek 之后添加 write 调用甚至:

if ((fd = creat(file_name, 0666)) < 0) // XXX edit to include write
{
    perror("File creation error.");
    //return 1;
}
if (lseek(fd, bytes - 1, SEEK_SET) == -1) // XXX seek to bytes - 1
{
    perror("Lseek function error.");
    //return 1;
}

// add this call to write a single byte @ position set by lseek.
if (write(fd, " ", 1) == -1)
{
    perror("Write function error.");
    //return 1;
}

close(fd);
return 0;